asp.net-mvc – ASP.NET MVC:如何在localhost上自动禁用[RequireHttps]?

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.NET MVC:如何在localhost上自动禁用[RequireHttps]?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我希望我的登录页面只能是SSL:
  1. [RequireHttps]
  2. public ActionResult Login()
  3. {
  4. if (Helper.LoggedIn)
  5. {
  6. Response.Redirect("/account/stats");
  7. }
  8.  
  9. return View();
  10. }

但是当我开发和调试我的应用程序时,显然它在localhost上不起作用。我不想使用带有SSL证书的IIS 7,如何自动禁用RequireHttps属性

更新

根据StackOverflow用户提供的信息和ASP.NET MVC 2源代码,我创建了以下类来解决问题。

  1. public class RequireSSLAttribute : FilterAttribute,IAuthorizationFilter
  2. {
  3. public virtual void OnAuthorization(AuthorizationContext filterContext)
  4. {
  5. if (filterContext == null)
  6. {
  7. throw new ArgumentNullException("filterContext");
  8. }
  9.  
  10. if (!filterContext.HttpContext.Request.IsSecureConnection)
  11. {
  12. HandleNonHttpsRequest(filterContext);
  13. }
  14. }
  15.  
  16. protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
  17. {
  18. if (filterContext.HttpContext.Request.Url.Host.Contains("localhost")) return;
  19.  
  20. if (!String.Equals(filterContext.HttpContext.Request.HttpMethod,"GET",StringComparison.OrdinalIgnoreCase))
  21. {
  22. throw new InvalidOperationException("The requested resource can only be accessed via SSL");
  23. }
  24.  
  25. string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
  26. filterContext.Result = new RedirectResult(url);
  27. }
  28. }

它的用法如下:

  1. [RequireSSL]
  2. public ActionResult Login()
  3. {
  4. if (Helper.LoggedIn)
  5. {
  6. Response.Redirect("/account/stats");
  7. }
  8.  
  9. return View();
  10. }

解决方法

最简单的方法是从RequireHttps派生一个新属性,并覆盖HandleNonHttpsRequest
  1. protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
  2. {
  3. if (!filterContext.HttpContext.Request.Url.Host.Contains("localhost"))
  4. {
  5. base.HandleNonHttpsRequest(filterContext);
  6. }
  7. }

HandleNonHttpsRequest是抛出异常的方法,在这里我们正在做的不是调用它,如果主机是localhost(和杰夫说,在他的评论中,你可以将其扩展到测试环境或实际上任何其他你想要的异常)。

猜你在找的asp.Net相关文章