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.
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í 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í.
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
.
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 , Lax
která odpovídá hodnotě nastavené ve vzorovém kódu.
.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