Sdílet prostřednictvím


Ukázka souboru cookie SameSite pro ASP.NET WebForms 4.7.2 C#

Rozhraní .NET Framework 4.7 má integrovanou podporu pro atribut SameSite , ale dodržuje původní standard. Opravené chování změnilo význam SameSite.None tak, že atribut s hodnotou None je nyní emitován, místo aby hodnota nebyla vůbec emitována. Pokud chcete negenerovat hodnotu, můžete vlastnost souboru cookie nastavit SameSite na hodnotu -1.

Zápis atributu SameSite

Následuje příklad, jak na soubor cookie napsat atribut SameSite;

// 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);

Pokud to čtete v jiném jazyce než v angličtině, dejte nám vědět v tomto problému s diskuzí na GitHubu , pokud chcete vidět komentáře ke kódu ve vašem nativním jazyce.

Výchozí atribut sameSite pro soubor cookie ověřování formulářů je nastaven v cookieSameSite parametru nastavení ověřování formulářů v části web.config

<system.web>
  <authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
    </forms>
  </authentication>
</system.web>

Výchozí atribut sameSite pro stav relace je také nastaven v parametru cookieSameSite nastavení relace v web.config

<system.web>
  <sessionState cookieSameSite="None">     
  </sessionState>
</system.web>

Aktualizace rozhraní .NET z listopadu 2019 změnila výchozí nastavení pro ověřování formulářů a relaci na lax, což je nejkompatibilnější nastavení, ale pokud vkládáte stránky do iframů, může být nutné toto nastavení vrátit na hodnotu Žádný a poté přidat níže uvedený kód zachycenínone, abyste upravili chování v závislosti na schopnostech prohlížeče.

Spuštění ukázkového programu

Pokud spustíte ukázkový projekt, načtěte ladicí program prohlížeče na úvodní stránku a použijte ho k zobrazení kolekce souborů cookie pro daný web. Uděláte to tak, že v prohlížečích Edge a Chrome stisknete F12, pak vyberete kartu Application a kliknete na adresu URL webu pod volbou Cookies v sekci Storage.

Seznam souborů cookie ladicího programu prohlížeče

Z výše uvedeného obrázku můžete vidět, že soubor cookie vytvořený ukázkou po kliknutí na tlačítko Vytvořit soubory cookie má hodnotu atributu SameSite , Laxkterá odpovídá hodnotě nastavené v ukázkovém kódu.

Zachycení souborů cookie, které neřídíte

.NET 4.5.2 zavedl novou událost pro zachycení zápisu hlaviček, Response.AddOnSendingHeaders. To lze použít k zachycení souborů cookie před jejich vrácením do klientského počítače. V ukázce vytvoříme událost statickou metodou, která zkontroluje, jestli prohlížeč podporuje nové změny sameSite, a pokud ne, změní soubory cookie tak, aby nevysílaly atribut, pokud byla nastavena nová None hodnota.

Podívejte se na soubor global.asax pro ukázku připojení události a na SameSiteCookieRewriter.cs pro ukázku zpracování události a úpravy atributu 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
                    }
                }
            });
        }
    }
}

Specifické chování pojmenovaných souborů cookie můžete změnit podobným způsobem. Níže uvedená ukázka upraví výchozí ověřovací soubor cookie z Lax na None v prohlížečích, které podporují hodnotu None, nebo odebere atribut sameSite v prohlížečích, které nepodporují 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;
            }
        }
    });
}

Další informace

Aktualizace Chromu

Dokumentace k ASP.NET

Opravy .NET SameSite