Exemple de cookie SameSite pour ASP.NET 4.7.2 VB WebForms
.NET Framework 4.7 prend en charge l’attribut SameSite , mais il respecte la norme d’origine.
Le comportement corrigé a changé la signification de SameSite.None
pour émettre l’attribut avec la valeur , au lieu de None
ne pas émettre la valeur du tout. Si vous ne souhaitez pas émettre la valeur, vous pouvez définir la SameSite
propriété sur un cookie sur -1.
Voici un exemple d’écriture d’un attribut SameSite sur un 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)
Si vous lisez ceci dans une langue autre que l’anglais, faites-le nous savoir dans ce problème de discussion GitHub si vous souhaitez voir les commentaires de code dans votre langue maternelle.
L’attribut sameSite par défaut pour un cookie d’authentification par formulaire est défini dans le cookieSameSite
paramètre des paramètres d’authentification par formulaire dans web.config
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
</forms>
</authentication>
</system.web>
L’attribut sameSite par défaut pour l’état de session est également défini dans le paramètre « cookieSameSite » des paramètres de session dans web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
La mise à jour de novembre 2019 vers .NET a modifié les paramètres par défaut pour l’authentification par formulaire et la session lax
en tant que paramètre le plus compatible. Toutefois, si vous incorporez des pages dans des iframes, vous devrez peut-être rétablir ce paramètre sur Aucune, puis ajouter le code d’interception indiqué ci-dessous pour ajuster le comportement en fonction de la fonctionnalité du none
navigateur.
Si vous exécutez l’exemple de projet, chargez votre débogueur de navigateur sur la page initiale et utilisez-le pour afficher la collection de cookies du site.
Pour ce faire, dans Edge et Chrome, appuyez F12
sur l’onglet Application
, puis cliquez sur l’URL du site sous l’option Cookies
de la Storage
section.
Vous pouvez voir dans l’image ci-dessus que le cookie créé par l’exemple lorsque vous cliquez sur le bouton « Créer des cookies » a une valeur d’attribut SameSite correspondant Lax
à la valeur définie dans l’exemple de code.
.NET 4.5.2 a introduit un nouvel événement pour intercepter l’écriture d’en-têtes, Response.AddOnSendingHeaders
. Cela peut être utilisé pour intercepter les cookies avant qu’ils ne soient retournés à l’ordinateur client. Dans l’exemple, nous l’assumons à une méthode statique qui vérifie si le navigateur prend en charge les nouvelles modifications sameSite et, dans le cas contraire, modifie les cookies pour ne pas émettre l’attribut si la nouvelle None
valeur a été définie.
Consultez global.asax pour obtenir un exemple de branchement de l’événement et SameSiteCookieRewriter.cs pour obtenir un exemple de gestion de l’événement et d’ajustement de l’attribut de cookie sameSite
.
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
Vous pouvez modifier le comportement d’un cookie nommé spécifique de la même façon ; l’exemple ci-dessous ajuste le cookie d’authentification par défaut de Lax
à None
sur les navigateurs qui prennent en charge la None
valeur, ou supprime l’attribut sameSite sur les navigateurs qui ne prennent pas en charge 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