Asp.net-Mvc

ASP.NET MVC:如何在 localhost 上自動禁用 [RequireHttps]?

  • September 2, 2010

我希望我的登錄頁面僅為 SSL:

   [RequireHttps]
   public ActionResult Login()
   {
       if (Helper.LoggedIn)
       {
           Response.Redirect("/account/stats");
       }

       return View();
   }

但顯然,當我開發和調試我的應用程序時,它在 localhost 上不起作用。我不想將 IIS 7 與 SSL 證書一起使用,如何自動禁用 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,我們在這裡所做的就是不呼叫它(正如 Jeff 在他的評論中所說,您可以將其擴展到測試環境或實際上您想要的任何其他異常)。

引用自:https://stackoverflow.com/questions/3628181