【发布时间】:2014-02-05 04:24:48
【问题描述】:
在我的 MVC4 Mobile 应用程序中,我有注册、登录页面和剩余页面。我想将所有敏感信息页面(如注册和登录页面)的用户重定向到 HTTPS 连接,并将 HTTP 重定向到重新邮寄页面。
【问题讨论】:
-
我想重定向我网站中的一些页面。不是所有页面或整个网站。
标签: asp.net-mvc-4
在我的 MVC4 Mobile 应用程序中,我有注册、登录页面和剩余页面。我想将所有敏感信息页面(如注册和登录页面)的用户重定向到 HTTPS 连接,并将 HTTP 重定向到重新邮寄页面。
【问题讨论】:
标签: asp.net-mvc-4
我更喜欢你使用条件函数来放置类
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 中使用它,您会发现放置此代码的页面的加载页面出错。
因此,当您分配主机而不是使用具有特定端口号的本地主机时,这将起作用。
【讨论】:
在您希望成为 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 的影响。
【讨论】:
HTTPS 是否有效?