Przykład pliku cookie SameSite dla ASP.NET C# 4.7.2 WebForms

.NET Framework 4,7 ma wbudowaną obsługę atrybutu SameSite , ale jest zgodna z oryginalnym standardem. Zachowanie poprawek zostało zmienione znaczenia SameSite.None, aby emitować atrybut o wartości None, zamiast wyemitować wartość w ogóle. Jeśli nie chcesz emitować wartości, możesz ustawić właściwość SameSite w pliku cookie na wartość-1.

Pisanie atrybutu SameSite

Poniżej przedstawiono przykład sposobu pisania atrybutu SameSite w pliku 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);

Jeśli czytasz ten kod w języku innym niż angielski, daj nam znać ten problem w dyskusji w witrynie GitHub, jeśli chcesz zobaczyć Komentarze do kodu w Twoim języku macierzystym.

Domyślny atrybut sameSite dla pliku cookie uwierzytelniania formularzy jest ustawiany w cookieSameSite parametr ustawień uwierzytelniania formularzy w web.config

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

Domyślny atrybut sameSite stanu sesji jest również ustawiany w parametrze "cookieSameSite" ustawień sesji w web.config

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

Aktualizacja z listopada 2019 do platformy .NET zmieniła domyślne ustawienia uwierzytelniania formularzy i sesji na lax jak jest to najbezpieczniejsze ustawienie, jednak jeśli osadzasz strony w iframes, może być konieczne przywrócenie tego ustawienia do wartości none, a następnie dodanie kodu przechwycenia pokazanego poniżej w celu dostosowania zachowania none w zależności od możliwości przeglądarki.

Uruchamianie przykładowej aplikacji

Po uruchomieniu przykładowego projektu Załaduj debuger przeglądarki na stronie początkowej i użyj go do wyświetlenia kolekcji plików cookie dla witryny. Aby to zrobić, w przeglądarkach Microsoft Edge i Chrome naciśnij F12 następnie wybierz kartę Application i kliknij adres URL witryny poniżej opcji Cookies w sekcji Storage.

Lista plików cookie debugera przeglądarki

Po kliknięciu przycisku "Utwórz pliki cookie" można zobaczyć, że w powyższym obrazie plik cookie został utworzony przez próbkę LaxSameSite, dopasowując wartość ustawioną w przykładowym kodzie.

Przechwytywanie plików cookie, które nie są kontrolowane

W programie .NET 4.5.2 wprowadzono nowe zdarzenie dotyczące przechwytywania zapisu nagłówków, Response.AddOnSendingHeaders. Może to służyć do przechwytywania plików cookie przed ich zwróceniem do komputera klienckiego. W przykładzie tworzymy zdarzenie do metody statycznej, która sprawdza, czy przeglądarka obsługuje nowe zmiany sameSite, a jeśli nie, zmienia pliki cookie, aby nie wyemitować atrybutu, jeśli ustawiono nową wartość None.

Zapoznaj się z plikiem Global. asax przykładem, aby dowiedzieć się, jak podłączyć zdarzenie i SameSiteCookieRewriter.cs na przykład obsłużyć zdarzenie i dostosować atrybut sameSite plików cookie.

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

W ten sam sposób można zmienić określone zachowanie nazwanego pliku cookie. Poniższy przykład dostosowuje domyślny plik cookie uwierzytelniania z Lax do None w przeglądarkach obsługujących wartość None lub usuwa atrybut sameSite w przeglądarkach, które nie obsługują 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;
            }
        }
    });
}

Więcej informacji

Aktualizacje programu Chrome

Dokumentacja ASP.NET

Poprawki programu .NET SameSite