SameSite-Cookiebeispiel für ASP.NET 4.7.2 VB WebForms
.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 None
wird, 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.
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 ein Formularauthentifizierungscookies wird im cookieSameSite
Parameter der Formularauthentifizierungseinstellungen in festgelegt. web.config
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
</forms>
</authentication>
</system.web>
Das standardmäßige sameSite-Attribut für den Sitzungszustand wird auch im Parameter "cookieSameSite" der Sitzungseinstellungen in festgelegt. web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
Mit dem Update vom November 2019 auf .NET wurden die Standardeinstellungen für Formularauthentifizierung und Sitzung in lax
die am besten kompatible Einstellung geändert. Wenn Sie Seiten in iframes einbetten, müssen Sie diese Einstellung möglicherweise in Keine rückgängig machen und dann den unten gezeigten Abfangcode hinzufügen, um das Verhalten abhängig von der none
Browserfunktion anzupassen.
Wenn Sie das Beispielprojekt ausführen, laden Sie 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 Storage
Cookies
Website.
In der obigen Abbildung sehen Sie, dass das vom Beispiel erstellte Cookie, wenn Sie auf die Schaltfläche "Cookies erstellen" klicken, den SameSite-Attributwert aufweist, der Lax
dem im Beispielcode festgelegten Wert entspricht.
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.
Ein Beispiel für die Verarbeitung des Ereignisses und das Anpassen des Cookie-Attributs sameSite
finden Sie unter global.asax und 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
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