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 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 den Sitzungszustand wird im Parameter "cookieSameSite" der Sitzungseinstellungen in festgelegt. web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
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.
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 Storage
Cookies
Website.
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 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.
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