Leggere in inglese

Condividi tramite


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.

Scrittura dell'attributo SameSite

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.

Esecuzione dell'esempio

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.

Elenco dei cookie del debugger del browser

È 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.

Intercettare i cookie che non controllano

.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;
            }
        }
    });
}

Altre informazioni

Aggiornamenti Chrome

Documentazione di ASP.NET

Patch .NET SameSite