Esempio di cookie SameSite per ASP.NET 4.7.2 VB MVC
.NET Framework 4.7 ha il supporto predefinito per l'attributo SameSite , ma rispetta lo standard originale.
Il comportamento con patch ha modificato il significato di SameSite.None
per generare l'attributo con un valore di None
, anziché non generare il valore in tutto. Se si vuole non generare il valore, è possibile impostare la SameSite
proprietà su un cookie su -1.
Di seguito è riportato un esempio di come scrivere un attributo SameSite in 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)
Se si legge questa operazione in una lingua diversa dall'inglese, in questo problema di discussione su GitHub è possibile visualizzare i commenti del codice nella lingua nativa.
Lo stesso attributo defaultSite per lo stato della sessione viene impostato nel parametro 'cookieSameSite' delle impostazioni della sessione in web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
L'autenticazione basata su cookie OWIN MVC usa una gestione cookie per abilitare la modifica degli attributi dei cookie. SameSiteCookieManager.vb è un'implementazione di tale classe che è possibile copiare nei propri progetti.
È necessario assicurarsi che i componenti Microsoft.Owin siano tutti aggiornati alla versione 4.1.0 o successiva. Controllare il packages.config
file per assicurarsi che tutti i numeri di versione corrispondano, ad esempio.
<?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>
I componenti di autenticazione devono essere configurati per usare CookieManager nella classe di avvio;
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
Una gestione cookie deve essere impostata su ogni componente che lo supporta, che include CookieAuthentication e OpenIdConnectAuthentication.
SystemWebCookieManager viene usato per evitare problemi noti con l'integrazione dei cookie di risposta.
Se si esegue il progetto di esempio, caricare il debugger del browser nella pagina iniziale e usarlo per visualizzare la raccolta cookie per il sito.
A tale scopo in Edge e Chrome premere F12
quindi selezionare la Application
scheda e fare clic sull'URL del Storage
sito sotto l'opzione Cookies
nella sezione.
È possibile vedere dall'immagine precedente che il cookie creato dall'esempio quando si fa clic sul pulsante "Create SameSite Cookie" ha un valore di attributo SameSite di Lax
, corrispondente al valore impostato nel codice di esempio.
.NET 4.5.2 ha introdotto un nuovo evento per intercettare la scrittura di intestazioni, Response.AddOnSendingHeaders
. Questa operazione può essere usata per intercettare i cookie prima che vengano restituiti al computer client. Nell'esempio viene eseguito il collegamento dell'evento a un metodo statico che verifica se il browser supporta le modifiche dello stesso sito e, in caso contrario, modifica i cookie per non generare l'attributo se il nuovo None
valore è stato impostato.
Vedere global.asax per un esempio di collegamento all'evento e SameSiteCookieRewriter.vb per un esempio di gestione dell'evento e modifica dell'attributo cookie sameSite
che è possibile copiare nel proprio codice.
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
È possibile modificare il comportamento specifico dei cookie denominati nello stesso modo; l'esempio seguente regola il cookie di autenticazione predefinito da Lax
a None
nei browser che supportano il None
valore o rimuove lo stesso attributoSite nei browser che non supportano 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