Przykładowy plik cookie SameSite dla ASP.NET 4.7.2 C# WebForms

.NET Framework 4.7 ma wbudowaną obsługę atrybutu SameSite, ale jest zgodny z oryginalnym standardem. Poprawione zachowanie zmieniło znaczenie SameSite.None , aby emitować atrybut z wartością None, a nie emitować wartości w ogóle. Jeśli nie chcesz emitować wartości, możesz ustawić SameSite właściwość na pliku cookie na -1.

Pisanie atrybutu SameSite

Poniżej przedstawiono przykładowy sposób 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 to w języku innym niż angielski, daj nam znać w tym problemie z dyskusją w usłudze GitHub , jeśli chcesz zobaczyć komentarze kodu w twoim języku natywnym.

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

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

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

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

Aktualizacja z listopada 2019 r. na platformę .NET zmieniła domyślne ustawienia uwierzytelniania i sesji lax formularzy na tak, jak jest to najbardziej zgodne ustawienie, jednak w przypadku osadzania stron w elementach iframe może być konieczne przywrócenie tego ustawienia na Wartość Brak, a następnie dodanie poniższego kodu przechwytywania w celu dostosowania none zachowania w zależności od możliwości przeglądarki.

Uruchamianie przykładowej aplikacji

Jeśli uruchomisz przykładowy projekt, załadujesz debuger przeglądarki na stronie początkowej i użyjesz go do wyświetlenia zbioru plików cookie dla witryny. Aby to zrobić w przeglądarce Microsoft Edge i Chrome, naciśnij F12 klawisz , a następnie wybierz Application kartę i kliknij adres URL witryny w Cookies obszarze opcji w Storage sekcji .

Lista plików cookie debugera przeglądarki

Na powyższym obrazie widać, że plik cookie utworzony przez przykład po kliknięciu przycisku "Utwórz pliki cookie" ma wartość atrybutu LaxSameSite o wartości , pasując do wartości ustawionej w przykładowym kodzie.

Przechwytywanie plików cookie, których nie kontrolujesz

Platforma .NET 4.5.2 wprowadziła nowe zdarzenie do przechwytywania zapisywania nagłówków. Response.AddOnSendingHeaders Może to służyć do przechwytywania plików cookie przed ich powrotem do komputera klienckiego. W przykładzie podłączamy zdarzenie do metody statycznej, która sprawdza, czy przeglądarka obsługuje nowe zmiany witryny sameSite, a jeśli nie, zmienia pliki cookie, aby nie emitować atrybutu, jeśli nowa None wartość została ustawiona.

Zobacz plik global.asax , aby zapoznać się z przykładem podłączania zdarzenia i pliku SameSiteCookieRewriter.cs , aby zapoznać się z przykładem obsługi zdarzenia i dostosowania atrybutu pliku 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
                    }
                }
            });
        }
    }
}

Można zmienić określone nazwane zachowanie pliku cookie w taki sam sposób; Poniższy przykład dostosowuje domyślny plik cookie uwierzytelniania z Lax do None w przeglądarkach, które obsługują None wartość, lub usuwa ten sam atrybut Witryny 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 chrome

Dokumentacja programu ASP.NET

Poprawki samesite platformy .NET