Esempio di cookie SameSite per ASP.NET 4.7.2 C# WebForms
.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
HttpCookie sameSiteCookie = 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;
// 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.
L'attributo predefinito sameSite per un cookie di autenticazione form viene impostato nel cookieSameSite
parametro delle impostazioni di autenticazione dei moduli 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 e la sessione lax
di Forms in 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 regolare il comportamento a seconda della none
funzionalità del browser.
Se si esegue il progetto di esempio si carica il debugger del browser nella pagina iniziale e lo si usa 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 "Crea 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.cs per un esempio di gestione dell'evento e modifica dell'attributo cookie sameSite
.
public static void FilterSameSiteNoneForIncompatibleUserAgents(object sender)
{
HttpApplication application = sender as HttpApplication;
if (application != null)
{
var userAgent = application.Context.Request.UserAgent;
if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
{
HttpContext.Current.Response.AddOnSendingHeaders(context =>
{
var cookies = context.Response.Cookies;
for (var i = 0; i < cookies.Count; i++)
{
var cookie = cookies[i];
if (cookie.SameSite == SameSiteMode.None)
{
cookie.SameSite = (SameSiteMode)(-1); // Unspecified
}
}
});
}
}
}
È 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 static void AdjustSpecificCookieSettings()
{
HttpContext.Current.Response.AddOnSendingHeaders(context =>
{
var cookies = context.Response.Cookies;
for (var i = 0; i < cookies.Count; i++)
{
var cookie = cookies[i];
// Forms auth: ".ASPXAUTH"
// Session: "ASP.NET_SessionId"
if (string.Equals(".ASPXAUTH", cookie.Name, StringComparison.Ordinal))
{
if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
{
cookie.SameSite = -1;
}
else
{
cookie.SameSite = SameSiteMode.None;
}
cookie.Secure = true;
}
}
});
}