Esempio di cookie SameSite per ASP.NET WebForms 4.7.2 VB
.NET Framework 4.7 include il supporto predefinito per l'attributo SameSite , ma è conforme allo standard originale.
Il comportamento con patch ha modificato il significato di SameSite.None
per generare l'attributo con un valore , None
anziché generare il valore. Se si desidera 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 sta leggendo questa operazione in una lingua diversa dall'inglese, segnalarlo in questo problema di discussione su GitHub se si vogliono visualizzare i commenti del codice nella lingua nativa.
L'attributo predefinito sameSite per un cookie di autenticazione basata su form viene impostato nel cookieSameSite
parametro delle impostazioni di autenticazione basata su form in web.config
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
</forms>
</authentication>
</system.web>
L'attributo predefinito sameSite per lo stato della sessione viene impostato anche nel parametro 'cookieSameSite' delle impostazioni della sessione in web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
L'aggiornamento di novembre 2019 a .NET ha modificato le impostazioni predefinite per l'autenticazione basata su form e la sessione lax
come è l'impostazione più compatibile, tuttavia se si incorporano pagine in iframe potrebbe essere necessario ripristinare questa impostazione su Nessuno e quindi aggiungere il codice di intercettazione illustrato di seguito per modificare il comportamento in base alla funzionalità del none
browser.
Se si esegue il progetto di esempio, caricare il debugger del browser nella pagina iniziale e usarlo per visualizzare la raccolta di cookie per il sito.
A tale scopo, in Edge e Chrome premere F12
quindi selezionare la Application
scheda e fare clic sull'URL del sito sotto l'opzione Cookies
nella Storage
sezione.
È possibile vedere dall'immagine precedente che il cookie creato dall'esempio quando si fa clic sul pulsante "Crea cookie" ha un valore di attributo SameSite pari Lax
a , che corrisponde 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 si collega l'evento a un metodo statico che controlla 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 associazione dell'evento e SameSiteCookieRewriter.cs per un esempio di gestione dell'evento e modifica dell'attributo 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
È 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