1. ホーム
  2. asp.net-mvc

[解決済み] ASP.NET MVC 本番環境下での RequireHttps の利用について

2022-08-15 08:54:13

質問

私は RequireHttpsAttribute を使用して、安全でない HTTP リクエストがアクションメソッドに送信されるのを防ぎたい。

C#

[RequireHttps] //apply to all actions in controller
public class SomeController 
{
    [RequireHttps] //apply to this action only
    public ActionResult SomeAction()
    {
        ...
    }
}

VB

<RequireHttps()> _
Public Class SomeController

    <RequireHttps()> _
    Public Function SomeAction() As ActionResult
        ...
    End Function

End Class

残念ながら、ASP.NET Development Server は HTTPS をサポートしていません。

ASP.NET MVC アプリケーションを本番環境に公開するときは RequireHttps を使用し、ASP.NET Development Server 上の開発用ワークステーションで実行するときは使用しないようにするには、どうすればよいでしょうか。

どのように解決するのですか?

開発用ワークステーションで Release ビルドを実行する場合、これは役に立ちませんが、条件付きコンパイルで解決できるかもしれません...。

#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では、属性は技術的には適用する定義と同じ行に含まれます。行の中に条件付きコンパイル文を置くことはできないので、関数宣言を2回書かざるを得ません - 属性付きと属性なしの2回です。しかし、醜さを気にしないのであれば、これは機能します。

#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

かなりすっきりしましたね。私の未試験のコードが実際に動作することを条件とします。