Auf Englisch lesen

Freigeben über


SameSite-Cookiebeispiel für ASP.NET 4.7.2 VB MVC

.NET Framework 4.7 verfügt über integrierte Unterstützung für das SameSite-Attribut, entspricht jedoch dem ursprünglichen Standard. Das gepatchte Verhalten hat die Bedeutung von SameSite.None geändert, sodass das Attribut mit dem Wert ausgegeben Nonewird, anstatt den Wert überhaupt nicht ausgibt. Wenn Sie den Wert nicht ausgeben möchten, können Sie die SameSite -Eigenschaft für ein Cookie auf -1 festlegen.

Schreiben des SameSite-Attributs

Im Folgenden finden Sie ein Beispiel für das Schreiben eines SameSite-Attributs in ein Cookie.

' 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)

Wenn Sie dies in einer anderen Sprache als Englisch lesen, teilen Sie uns dies in diesem GitHub-Diskussionsproblem mit, wenn Sie die Codekommentare in Ihrer Muttersprache sehen möchten.

Das standardmäßige sameSite-Attribut für den Sitzungszustand wird im Parameter "cookieSameSite" der Sitzungseinstellungen in festgelegt. web.config

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

MVC-Authentifizierung

Die cookiebasierte OWIN MVC-Authentifizierung verwendet einen Cookie-Manager, um die Änderung von Cookieattributen zu ermöglichen. SameSiteCookieManager.vb ist eine Implementierung einer solchen Klasse, die Sie in Ihre eigenen Projekte kopieren können.

Sie müssen sicherstellen, dass alle Ihre Microsoft.Owin-Komponenten auf Version 4.1.0 oder höher aktualisiert werden. Überprüfen Sie ihre packages.config Datei, um z. B. sicherzustellen, dass alle Versionsnummern übereinstimmen.

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <!-- other packages -->
  <package id="Microsoft.Owin.Host.SystemWeb" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Owin.Security" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Owin.Security.Cookies" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net472" />
  <package id="Owin" version="1.0" targetFramework="net472" />
</packages>

Die Authentifizierungskomponenten müssen für die Verwendung von CookieManager in Ihrer Startklasse konfiguriert sein.

Public Sub Configuration(app As IAppBuilder)
    app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
        .CookieSameSite = SameSiteMode.None,
        .CookieHttpOnly = True,
        .CookieSecure = CookieSecureOption.Always,
        .CookieManager = New SameSiteCookieManager(New SystemWebCookieManager())
    })
End Sub

Für jede Komponente, die dies unterstützt, muss ein Cookie-Manager festgelegt werden, einschließlich CookieAuthentication und OpenIdConnectAuthentication.

SystemWebCookieManager wird verwendet, um bekannte Probleme bei der Integration von Antwortcookies zu vermeiden.

Ausführen des Beispiels

Wenn Sie das Beispielprojekt ausführen, laden Sie bitte Ihren Browserdebugger auf der ersten Seite, und verwenden Sie ihn, um die Cookiesammlung für die Website anzuzeigen. Klicken Sie dazu in Edge und Chrome auf F12 die Application Registerkarte, und klicken Sie unter der Option im Abschnitt auf die Url der StorageCookies Website.

Cookieliste des Browserdebuggers

Sie können in der obigen Abbildung sehen, dass das vom Beispiel erstellte Cookie, wenn Sie auf die Schaltfläche "SameSite-Cookie erstellen" klicken, den SameSite-Attributwert aufweist, der Laxdem im Beispielcode festgelegten Wert entspricht.

Abfangen von Cookies, die Sie nicht kontrollieren

Mit .NET 4.5.2 wurde ein neues Ereignis zum Abfangen des Schreibens von Headern eingeführt. Response.AddOnSendingHeaders Dies kann verwendet werden, um Cookies abzufangen, bevor sie an den Clientcomputer zurückgegeben werden. Im Beispiel verknüpfen wir das Ereignis mit einer statischen Methode, die überprüft, ob der Browser die neuen sameSite-Änderungen unterstützt. Wenn dies nicht der Fall ist, werden die Cookies so geändert, dass das Attribut nicht ausgegeben wird, wenn der neue None Wert festgelegt wurde.

Unter global.asax finden Sie ein Beispiel für das Einbinden des Ereignisses und SameSiteCookieRewriter.vb für ein Beispiel für die Behandlung des Ereignisses und das Anpassen des Cookieattributs sameSite , das Sie in Ihren eigenen Code kopieren können.

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

Sie können bestimmtes Benanntes Cookie-Verhalten auf die gleiche Weise ändern. Im folgenden Beispiel wird das Standardauthentifizierungscooky von Lax auf None in Browsern angepasst, die den None Wert unterstützen, oder das attribut sameSite in Browsern entfernt, die nicht unterstützen None.

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

Weitere Informationen

Chrome-Updates

OWIN SameSite-Dokumentation

ASP.NET-Dokumentation

.NET SameSite-Patches