Asp.net-Mvc
ASP.NET MVC:如何在 localhost 上自動禁用 [RequireHttps]?
我希望我的登錄頁面僅為 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 在他的評論中所說,您可以將其擴展到測試環境或實際上您想要的任何其他異常)。