Asp.net-Mvc
ASP.NET MVC RequireHttps 僅在生產中
我想使用RequireHttpsAttribute來防止將不安全的 HTTP 請求發送到操作方法。
C#
[RequireHttps] //apply to all actions in controller public class SomeController { [RequireHttps] //apply to this action only public ActionResult SomeAction() { ... } }等等
<RequireHttps()> _ Public Class SomeController <RequireHttps()> _ Public Function SomeAction() As ActionResult ... End Function End Class不幸的是,ASP.NET 開發伺服器不支持 HTTPS。
如何讓我的 ASP.NET MVC 應用程序在發佈到生產環境時使用 RequireHttps,但在 ASP.NET 開發伺服器上的開發工作站上執行時不使用?
如果您在開發工作站上執行發布版本,這將無濟於事,但條件編譯可以完成這項工作……
#if !DEBUG [RequireHttps] //apply to all actions in controller #endif public class SomeController { //... or ... #if !DEBUG [RequireHttps] //apply to this action only #endif public ActionResult SomeAction() { } }更新
在 Visual Basic 中,屬性在技術上與它們所應用的定義屬於同一行。您不能將條件編譯語句放在一行內,因此您不得不編寫兩次函式聲明 - 一次使用屬性,一次沒有。但是,如果您不介意醜陋,它確實有效。
#If Not Debug Then <RequireHttps()> _ Function SomeAction() As ActionResult #Else Function SomeAction() As ActionResult #End If ... End Function更新 2
RequireHttpsAttribute有幾個人在沒有提供範例的情況下提到了派生,所以這裡有一個給你。我認為這種方法比條件編譯方法要乾淨得多,這將是我在您的位置上的偏好。免責聲明:我沒有測試過這段程式碼,哪怕是一點點,我的 VB 相當生疏。我所知道的是它可以編譯。我是根據 spot、queen3 和 Lance Fisher 的建議編寫的。如果它不起作用,它至少應該傳達總體構想,並為您提供起點。
Public Class RemoteRequireHttpsAttribute Inherits System.Web.Mvc.RequireHttpsAttribute Public Overrides Sub OnAuthorization(ByVal filterContext As _ System.Web.Mvc.AuthorizationContext) If IsNothing(filterContext) Then Throw New ArgumentNullException("filterContext") End If If Not IsNothing(filterContext.HttpContext) AndAlso _ filterContext.HttpContext.Request.IsLocal Then Return End If MyBase.OnAuthorization(filterContext) End Sub End Class基本上,如果目前請求是本地的(也就是說,您正在通過 localhost 訪問該站點),新屬性只是退出而不是執行預設的 SSL 授權程式碼。你可以像這樣使用它:
<RemoteRequireHttps()> _ Public Class SomeController <RemoteRequireHttps()> _ Public Function SomeAction() As ActionResult ... End Function End Class乾淨多了!如果我未經測試的程式碼確實有效。