我希望我的登录页面仅使用 SSL:
[RequireHttps]
public ActionResult Login()
{
if (Helper.LoggedIn)
{
Response.Redirect("/account/stats");
}
return View();
}
但很明显,当我开发和调试我的应用程序时,它在本地主机上不起作用。我不想使用带 SSL 证书的 IIS 7,如何自动禁用 RequireHttps 属性?
更新
根据 StackOverflow 用户和 ASP.NET MVC 2 源代码提供的信息,我创建了以下解决问题的类。
public class RequireSSLAttribute : FilterAttribute, IAuthorizationFilter
{
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.HttpContext.Request.IsSecureConnection)
{
HandleNonHttpsRequest(filterContext);
}
}
protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.Url.Host.Contains("localhost")) return;
if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("The requested resource can only be accessed via SSL");
}
string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult(url);
}
}
它是这样使用的:
[RequireSSL]
public ActionResult Login()
{
if (Helper.LoggedIn)
{
Response.Redirect("/account/stats");
}
return View();
}
最佳答案
最简单的方法是从 RequireHttps 派生一个新属性并覆盖 HandleNonHttpsRequest
protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.Request.Url.Host.Contains("localhost"))
{
base.HandleNonHttpsRequest(filterContext);
}
}
HandleNonHttpsRequest 是抛出异常的方法,这里我们所做的只是在主机是本地主机时不调用它(正如 Jeff 在他的评论中所说,您可以将其扩展到测试环境或实际上您想要的任何其他异常).
关于asp.net-mvc - ASP.NET MVC : How to automatically disable [RequireHttps] on localhost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3628181/