我希望我的登录页面只能是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(和杰夫说,在他的评论中,你可以将其扩展到测试环境或实际上任何其他你想要的异常)。