Asp.net-Mvc

ASP.NET MVC RequireHttps 僅在生產中

  • October 28, 2009

我想使用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

乾淨多了!如果我未經測試的程式碼確實有效。

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