Exemple de cookie SameSite pour ASP.NET 4.7.2 VB WebForms

.NET Framework 4.7 prend en charge l’attribut SameSite intégré, mais il respecte la norme d’origine. Le comportement corrigé a changé la signification de SameSite.None, qui émet désormais l'attribut avec une valeur de None, au lieu de ne pas émettre de valeur du tout. Si vous ne souhaitez pas émettre la valeur, vous pouvez définir la propriété SameSite d'un cookie à -1.

Écriture de l’attribut SameSite

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 cela dans une langue autre que l’anglais, indiquez-nous dans ce problème de discussion GitHub si vous souhaitez voir les commentaires de code dans votre langue native.

Le paramètre sameSite par défaut pour un cookie d’authentification par formulaire est défini dans le paramètre cookieSameSite des paramètres d’authentification par formulaires 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 sur .NET a modifié les paramètres par défaut de l’authentification par formulaire et de la session lax comme étant le paramètre le plus compatible. Toutefois, si vous incorporez des pages dans des iframes, vous devrez peut-être rétablir ce paramètre sur None, puis ajouter le code d’interception indiqué ci-dessous pour ajuster le comportement en fonction de la none fonctionnalité du navigateur.

Exécution de l’exemple

Si vous exécutez le projet d'exemple, chargez votre débogueur de navigateur sur la page initiale et servez-vous-en pour afficher la collection de cookies du site. Pour ce faire, dans Edge et Chrome, appuyez sur F12 puis sélectionnez l’onglet Application et cliquez sur l’URL du site sous l’option Cookies de la section Storage.

Liste des cookies du débogueur du navigateur

Vous pouvez voir à partir de 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 , Laxcorrespondant à la valeur définie dans l’exemple de code.

Interception des cookies que vous ne contrôlez pas

.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 avons connecté l’événement à une méthode statique qui vérifie si le navigateur prend en charge les nouvelles modifications de site et, si ce n’est pas le cas, 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 raccordement de l’événement et de 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 spécifique des cookies nommés 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 valeur None, 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

Plus d’informations

Mises à jour Chrome

ASP.NET Documentation

Correctifs .NET SameSite