Číst v angličtině

Sdílet prostřednictvím


Ukázka souboru cookie SameSite pro webové formuláře ASP.NET 4.7.2 VB

Rozhraní .NET Framework 4.7 má integrovanou podporu atributu SameSite , ale dodržuje původní standard. Opravené chování změnilo význam SameSite.None atributu tak, aby vygeneroval atribut s hodnotou None, místo aby nevygeneroval hodnotu vůbec. Pokud nechcete hodnotu vygenerovat, můžete u souboru cookie nastavit SameSite vlastnost na hodnotu -1.

Zápis atributu SameSite

Následuje příklad zápisu atributu SameSite na soubor 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)

Pokud toto téma čtete v jiném jazyce než v angličtině, dejte nám vědět v tomto problému s diskuzí na GitHubu , pokud chcete zobrazit komentáře ke kódu ve vašem rodném jazyce.

Výchozí atribut sameSite pro soubor cookie ověřování formulářů je nastavený v parametru cookieSameSite nastavení ověřování formulářů v web.config

<system.web>
  <authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
    </forms>
  </authentication>
</system.web>

Výchozí atribut sameSite pro stav relace je také nastavený v parametru cookieSameSite v nastavení relace v web.config

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

Aktualizace .NET z listopadu 2019 změnila výchozí nastavení pro ověřování pomocí formulářů a relace na lax nastavení, které je nejkompatibilnější. Pokud ale vložíte stránky do rámců iframe, možná budete muset vrátit toto nastavení na Žádné a potom přidat kód pro zachycení , který je uvedený níže, aby se chování upravilo none v závislosti na schopnostech prohlížeče.

Spuštění ukázky

Pokud spustíte ukázkový projekt, načtěte ladicí program prohlížeče na počáteční stránce a použijte ho k zobrazení kolekce souborů cookie pro daný web. V Edgi a Chromu to uděláte tak, že stisknete F12Application kartu a kliknete na adresu URL webu pod Cookies možností v oddílu Storage .

Seznam souborů cookie ladicího programu prohlížeče

Z výše uvedeného obrázku vidíte, že soubor cookie vytvořený ukázkou po kliknutí na tlačítko Vytvořit soubory cookie má hodnotu atributu SameSite , Laxkterá odpovídá hodnotě nastavené v ukázkovém kódu.

Zachycování souborů cookie, které nemáte pod kontrolou

.NET 4.5.2 zavedl novou událost pro zachycení zápisu hlaviček. Response.AddOnSendingHeaders Dá se použít k zachycení souborů cookie před jejich vrácením do klientského počítače. V ukázce provedeme převod události na statickou metodu, která zkontroluje, jestli prohlížeč podporuje nové změny sameSite, a pokud ne, změní soubory cookie tak, aby nevygenerovaly atribut, pokud byla nastavena nová None hodnota.

Příklad připojení události najdete v souboru global.asax a příklad zpracování události a úpravě atributu cookie sameSite v souboru 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

Můžete změnit konkrétní pojmenované chování souboru cookie podobným způsobem; Následující ukázka upraví výchozí ověřovací soubor cookie z Lax na None v prohlížečích, které podporují None hodnotu, nebo odebere atribut sameSite v prohlížečích, které nepodporují 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

Další informace

Aktualizace Chrome

Dokumentace k ASP.NET

Opravy .NET SameSite