【问题标题】:Redirect HTTP to HTTPS in MVC4 Mobile Application在 MVC4 移动应用程序中将 HTTP 重定向到 HTTPS
【发布时间】:2014-02-05 04:24:48
【问题描述】:

在我的 MVC4 Mobile 应用程序中,我有注册、登录页面和剩余页面。我想将所有敏感信息页面(如注册和登录页面)的用户重定向到 HTTPS 连接,并将 HTTP 重定向到重新邮寄页面。

【问题讨论】:

标签: asp.net-mvc-4


【解决方案1】:

我更喜欢你使用条件函数来放置类

public class RequireHttpsConditional : RequireHttpsAttribute
{
    protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
    {
        var useSslConfig = ConfigurationManager.AppSettings["UseSSL"];
        if (useSslConfig != null)
        {
            if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException("The requested resource can only be accessed via SSL.");
            }

            var request = filterContext.HttpContext.Request;
            string url = null;
            int sslPort;

            if (Int32.TryParse(useSslConfig, out sslPort) && sslPort > 0)
            {
                url = "https://" + request.Url.Host + request.RawUrl;

                if (sslPort != 443)
                {
                    var builder = new UriBuilder(url) { Port = sslPort };
                    url = builder.Uri.ToString();
                }
            }

            if (sslPort != request.Url.Port)
            {
                filterContext.Result = new RedirectResult(url);
            }
        }
    }
}

并在操作结果上方使用此[RequireHttpsConditional]

我在互联网的某个地方得到了这段代码,对我来说工作正常。

在 web.config appsettings 中使用<add key="UseSSL" value="443" />

在控制器上面你需要放的动作结果

  [RequireHttpsConditional]
  public ActionResult SignIn()
 {
 }

在 IIS 中,您的项目右键单击并单击“编辑绑定”,然后添加自定义类型 https 和端口号 443(您可以更改它)

请注意,这仅适用于生产环境。在本地执行时它不会工作。

当你在本地执行它时,你有 request.Url.Host 它将只返回你 localhost 并且缺少你的端口号。因此,如果您在 MVC 中使用它,您会发现放置此代码的页面的加载页面出错。

因此,当您分配主机而不是使用具有特定端口号的本地主机时,这将起作用。

【讨论】:

    【解决方案2】:

    在您希望成为 HTTPS 的控制器操作中,将以下代码添加到方法的顶部(当然您可以简单地将其添加到自己的方法中,然后调用它):

            if (!HttpContext.Request.IsSecureConnection)
            {
                var url = new UriBuilder(HttpContext.Request.Url);
    
                url.Scheme = "https";
    
                Response.Redirect(url.Uri.AbsoluteUri);
            }
    

    建议您在整个网站上保持 HTTPS 以防止 MITM attack 受到 auth cookie 的影响。

    【讨论】:

    • 当我在控制器中使用此代码时,我的视图没有显示。
    • 显示什么?您在 Firebug 中得到什么响应(HTTP 状态代码)?
    • 它没有显示任何错误信息。只是它只显示上一页。
    • 手动(在浏览器地址栏中)将 URL 更改为 HTTPS 是否有效?
    • 我的代码:#region Registration public ActionResult Registration() { if (!HttpContext.Request.IsSecureConnection) { var url = new UriBuilder(HttpContext.Request.Url); url.Scheme = "https"; Response.Redirect(url.Uri.AbsoluteUri); } SignUpModel 模型 = 新 SignUpModel();模型.取消订阅 = true; ViewBag.Message = "";返回视图(模型); }
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2023-04-03
    • 2011-06-24
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2017-05-16
    相关资源
    最近更新 更多