Číst v angličtině

Sdílet prostřednictvím


Ukázka souboru cookie SameSite pro ASP.NET 4.7.2 VB MVC

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 pro generování atributu s hodnotou None, místo aby se hodnota nevygenerovala vůbec. Pokud nechcete hodnotu vygenerovat, můžete vlastnost souboru cookie nastavit SameSite na hodnotu -1.

Zápis atributu SameSite

Následuje příklad, jak na soubor cookie zapsat atribut SameSite;

' 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 v diskuzi na GitHubu , pokud chcete vidět komentáře ke kódu ve svém rodném jazyce.

Výchozí atribut sameSite pro stav relace se nastavuje v parametru cookieSameSite v nastavení relace v web.config

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

Ověřování MVC

Ověřování na základě souborů cookie OWIN MVC používá správce souborů cookie k povolení změny atributů souborů cookie. SameSiteCookieManager.vb je implementace takové třídy, kterou můžete zkopírovat do vlastních projektů.

Musíte zajistit, aby všechny komponenty Microsoft.Owin byly upgradovány na verzi 4.1.0 nebo vyšší. Zkontrolujte packages.config soubor, abyste se například ujistili, že se shodují všechna čísla verzí.

<?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>

Součásti ověřování musí být nakonfigurovány tak, aby používaly CookieManager ve vaší spouštěcí třídě;

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

Pro každou komponentu, která ho podporuje, musí být nastavený správce souborů cookie, mezi které patří CookieAuthentication a OpenIdConnectAuthentication.

SystemWebCookieManager slouží k tomu, aby se zabránilo známým problémům s integrací souborů cookie odpovědí.

Spuštění ukázky

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

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

Na obrázku výše vidíte, že soubor cookie vytvořený ukázkou po kliknutí na tlačítko Vytvořit soubor cookie SameSite má hodnotu atributu SameSite , Laxkterá odpovídá hodnotě nastavené ve vzorové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 To se dá použít k zachycení souborů cookie před jejich vrácením do klientského počítače. V ukázce propojeme událost se statickou metodou, 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 v souboru SameSiteCookieRewriter.vb najdete příklad zpracování události a úpravu atributu cookie sameSite , který můžete zkopírovat do vlastního kódu.

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

Stejným způsobem můžete změnit konkrétní chování pojmenovaného souboru cookie. 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 OWIN SameSite

Dokumentace k ASP.NET

Opravy .NET SameSite