ASP.NET 4.7.2 VB WebForms の SameSite Cookie サンプル

.NET Framework 4.7 には SameSite 属性のサポートが組み込まれていますが、元の標準に準拠しています。 修正プログラムが適用された動作により、値をまったく出力するのではなく、SameSite.Noneの値を持つ属性を出力するようにNoneの意味が変更されました。 値を出力しない場合は、Cookie の SameSite プロパティを -1 に設定できます。

SameSite 属性の書き込み

Cookie に SameSite 属性を記述する方法の例を次に示します。

' Create the cookie
Dim sameSiteCookie As New HttpCookie("sameSiteSample")

' Set a value for the cookie
sameSiteCookie.Value = "sample"

' Set the secure flag, which Chrome's changes will require for SameSite none.
' Note this will also require you to be running on HTTPS
sameSiteCookie.Secure = True

' Set the cookie to HTTP only which is good practice unless you really do need
' to access it client side in scripts.
sameSiteCookie.HttpOnly = True

' Expire the cookie in 1 minute
sameSiteCookie.Expires = Date.Now.AddMinutes(1)

' Add the SameSite attribute, this will emit the attribute with a value of none.
' To Not emit the attribute at all set the SameSite property to -1.
sameSiteCookie.SameSite = SameSiteMode.None

' Add the cookie to the response cookie collection
Response.Cookies.Add(sameSiteCookie)

英語以外の言語でこれを読んでいる場合は、ネイティブ言語でコード コメントを表示する場合は、この GitHub ディスカッションの問題 でお知らせください。

フォーム認証 Cookie の既定の sameSite 属性は、フォーム認証設定の cookieSameSite パラメーターで設定されます。 web.config

<system.web>
  <authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
    </forms>
  </authentication>
</system.web>

セッション状態の既定の sameSite 属性は、セッション設定の 'cookieSameSite' パラメーターにも設定されます。 web.config

<system.web>
  <sessionState cookieSameSite="None">     
  </sessionState>
</system.web>

.NET への 2019 年 11 月の更新では、フォーム認証とセッションの既定の設定が最も互換性のある設定と同様に lax に変更されましたが、ページを iframe に埋め込む場合は、この設定を None に戻し、次に示す インターセプト コードを追加して、ブラウザーの機能に応じて none 動作を調整する必要があります。

サンプルの実行

サンプル プロジェクトを実行した場合は、ブラウザー デバッガーを初期ページに読み込み、それを使用してサイトの Cookie コレクションを表示します。 Edge と Chrome でこれを行うには、F12 キーを押してから Application タブを選び、Cookies セクションの Storage オプションの下にあるサイト URL をクリックします。

ブラウザー デバッガーの Cookie の一覧

上の図から、[Cookie の作成] ボタンをクリックしたときにサンプルによって作成された Cookie の SameSite 属性値が Laxで、 サンプル コードに設定されている値と一致していることがわかります。

制御しない Cookie をインターセプトする

.NET 4.5.2 では、ヘッダーの書き込みをインターセプトするための新しいイベントが導入 Response.AddOnSendingHeaders。 これは、クライアント コンピューターに返される前に Cookie をインターセプトするために使用できます。 このサンプルでは、ブラウザーが新しい sameSite の変更をサポートしているかどうかをチェックする静的メソッドにイベントを接続し、サポートされていない場合は、新しい None 値が設定されている場合に属性を出力しないように Cookie を変更します。

イベントをフックする例についてはglobal.asaxを、イベントを処理してCookie属性を調整する例についてはSameSiteCookieRewriter.csを参照してください。

Sub FilterSameSiteNoneForIncompatibleUserAgents(ByVal sender As Object)
    Dim application As HttpApplication = TryCast(sender, HttpApplication)

    If application IsNot Nothing Then
        Dim userAgent = application.Context.Request.UserAgent

        If SameSite.DisallowsSameSiteNone(userAgent) Then
            application.Response.AddOnSendingHeaders(
                Function(context)
                    Dim cookies = context.Response.Cookies

                    For i = 0 To cookies.Count - 1
                        Dim cookie = cookies(i)

                        If cookie.SameSite = SameSiteMode.None Then
                            cookie.SameSite = CType((-1), SameSiteMode)
                        End If
                    Next
                End Function)
        End If
    End If
End Sub

特定の名前付き Cookie の動作は、ほとんど同じ方法で変更できます。次のサンプルでは、Lax値をサポートするブラウザーで既定の認証 Cookie をNoneからNoneに調整するか、Noneをサポートしていないブラウザーで同じSite 属性を削除します。

Public Shared Sub AdjustSpecificCookieSettings()
    HttpContext.Current.Response.AddOnSendingHeaders(Function(context)
            Dim cookies = context.Response.Cookies

            For i = 0 To cookies.Count - 1
            Dim cookie = cookies(i)

            If String.Equals(".ASPXAUTH", cookie.Name, StringComparison.Ordinal) Then

                If SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent) Then
                    cookie.SameSite = -1
                Else
                    cookie.SameSite = SameSiteMode.None
                End If

                cookie.Secure = True
            End If
            Next
        End Function)
End Sub

詳細情報

Chrome の更新プログラム

ASP.NET ドキュメント

.NET SameSite の修正プログラム