我希望我的登录页面只能是SSL:
[RequireHttps] public ActionResult Login() { if (Helper.LoggedIn) { Response.Redirect("/account/stats"); } return View(); }
但是当我开发和调试我的应用程序时,显然它在localhost上不起作用。我不想使用带有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是抛出异常的方法,在这里我们正在做的不是调用它,如果主机是localhost(和杰夫说,在他的评论中,你可以将其扩展到测试环境或实际上任何其他你想要的异常)。