Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Pliki cookie sameSite i interfejs Open Web Interface for .NET (OWIN)

Autor: Rick Anderson

SameSitejest wersją roboczą IETF zaprojektowaną w celu zapewnienia ochrony przed atakami fałszerzowania żądań między witrynami (CSRF). Wersja robocza SameSite 2019:

  • Domyślnie traktuje pliki cookie SameSite=Lax .
  • Stwierdza pliki cookie, które jawnie potwierdzają SameSite=None , aby umożliwić dostarczanie między witrynami, powinny być oznaczone jako Secure.

Lax działa w przypadku większości plików cookie aplikacji. Niektóre formy uwierzytelniania, takie jak OpenID Connect (OIDC) i WS-Federation domyślne przekierowania oparte na post. Przekierowania oparte na post wyzwalają SameSite ochronę przeglądarki, dlatego SameSite są wyłączone dla tych składników. Większość logowań OAuth nie ma wpływu na różnice w sposobie przepływu żądań. Wszystkie inne składniki niedomyślnie ustawione SameSite i używają domyślnego zachowania klientów (stare lub nowe).

Parametr None powoduje problemy ze zgodnością z klientami, którzy zaimplementowali wcześniejszą wersję roboczą standardu 2016 (na przykład iOS 12). Zobacz Obsługa starszych przeglądarek w tym dokumencie.

Każdy składnik OWIN emitujący pliki cookie musi zdecydować, czy SameSite jest to odpowiednie.

Aby uzyskać ASP.NET 4.x wersji tego artykułu, zobacz Praca z plikami cookie SameSite w ASP.NET.

Użycie interfejsu API w usłudze SameSite

Microsoft.Owin ma własną implementację SameSite :

  • Nie jest to bezpośrednio zależne od elementu w System.Webprogramie .
  • SameSite działa na wszystkich wersjach docelowych przez Microsoft.Owin pakiety, .NET 4.5 i nowsze.
  • Tylko składnik SystemWebCookieManager bezpośrednio wchodzi w interakcję z klasą System.Web HttpCookie .

SystemWebCookieManager Zależy od interfejsów API platformy .NET 4.7.2 System.Web w celu włączenia SameSite obsługi oraz poprawek w celu zmiany zachowania.

Przyczyny użycia SystemWebCookieManager opisano w problemach z integracją plików cookie odpowiedzi OWIN i System.Web. SystemWebCookieManager polecenie jest zalecane w przypadku uruchamiania w systemie System.Web.

Poniższy kod ustawia wartość SameSite na Lax:

owinContext.Response.Cookies.Append("My Key", "My Value", new CookieOptions()
{
    SameSite = SameSiteMode.Lax
});

Następujące interfejsy API używają polecenia SameSite:

Historia i zmiany

Microsoft.Owin nigdy nie obsługiwał wersji roboczej standardu SameSite2016.

Obsługa wersji roboczej SameSite 2019 jest dostępna tylko w wersji Microsoft.Owin 4.1.0 lub nowszej. Nie ma poprawek dla wcześniejszych wersji.

Projekt specyfikacji z SameSite 2019 r.:

Obsługa starszych przeglądarek

Standard z 2016 SameSite r. nakazuje, aby nieznane wartości były traktowane jako SameSite=Strict wartości. Aplikacje dostępne ze starszych przeglądarek, które obsługują standard 2016 SameSite , mogą spowodować przerwanie działania SameSite właściwości z wartością None. Aplikacje internetowe muszą implementować wykrywanie przeglądarki, jeśli zamierzają obsługiwać starsze przeglądarki. ASP.NET nie implementuje wykrywania przeglądarki, ponieważ wartości User-Agents są wysoce niestabilne i często zmieniają się. Punkt rozszerzenia w narzędziu ICookieManager umożliwia podłączanie logiki specyficznej dla agenta użytkownika.

W Startup.Configurationpliku dodaj kod podobny do następującego:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseOpenIdConnectAuthentication(
             new OpenIdConnectAuthenticationOptions
             {
                 // … Your preexisting options … 
                 CookieManager = new SameSiteCookieManager(
                                     new SystemWebCookieManager())
             });

        // Remaining code removed for brevity.

Powyższy kod wymaga poprawki .NET 4.7.2 lub nowszej SameSite .

Poniższy kod przedstawia przykładową implementację elementu SameSiteCookieManager:

public class SameSiteCookieManager : ICookieManager
{
    private readonly ICookieManager _innerManager;

    public SameSiteCookieManager() : this(new CookieManager())
    {
    }

    public SameSiteCookieManager(ICookieManager innerManager)
    {
        _innerManager = innerManager;
    }

    public void AppendResponseCookie(IOwinContext context, string key, string value,
                                     CookieOptions options)
    {
        CheckSameSite(context, options);
        _innerManager.AppendResponseCookie(context, key, value, options);
    }

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
    {
        CheckSameSite(context, options);
        _innerManager.DeleteCookie(context, key, options);
    }

    public string GetRequestCookie(IOwinContext context, string key)
    {
        return _innerManager.GetRequestCookie(context, key);
    }

    private void CheckSameSite(IOwinContext context, CookieOptions options)
    {
        if (options.SameSite == Microsoft.Owin.SameSiteMode.None 
                             && DisallowsSameSiteNone(context))
        {
            options.SameSite = null;
        }
    }

W poprzednim przykładzie DisallowsSameSiteNone jest wywoływana w metodzie CheckSameSite . DisallowsSameSiteNone to metoda użytkownika, która wykrywa, czy agent użytkownika nie obsługuje SameSite Noneprogramu :

private void CheckSameSite(IOwinContext context, CookieOptions options)
{
    if (options.SameSite == Microsoft.Owin.SameSiteMode.None 
                         && DisallowsSameSiteNone(context))
    {
        options.SameSite = null;
    }
}

Poniższy kod przedstawia przykładową DisallowsSameSiteNone metodę:

Ostrzeżenie

Poniższy kod jest przeznaczony tylko dla pokazu:

  • Nie należy go uważać za ukończone.
  • Nie jest ona obsługiwana ani obsługiwana.
public static bool DisallowsSameSiteNone(IOwinContext context)
{
    var userAgent = context.Request.Headers["User-Agent"];
    
    if (string.IsNullOrEmpty(userAgent))
    {
        return false;
    }
    
    // Cover all iOS based browsers here. This includes:
    // - Safari on iOS 12 for iPhone, iPod Touch, iPad
    // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad
    // - Chrome on iOS 12 for iPhone, iPod Touch, iPad
    // All of which are broken by SameSite=None, because they use the iOS 
    // networking stack.
    if (userAgent.Contains("CPU iPhone OS 12") ||
        userAgent.Contains("iPad; CPU OS 12"))
    {
        return true;
    }

    // Cover Mac OS X based browsers that use the Mac OS networking stack. 
    // This includes:
    // - Safari on Mac OS X.
    // This does not include:
    // - Chrome on Mac OS X
    // Because they do not use the Mac OS networking stack.
    if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") &&
        userAgent.Contains("Version/") && userAgent.Contains("Safari"))
    {
        return true;
    }

    // Cover Chrome 50-69, because some versions are broken by SameSite=None, 
    // and none in this range require it.
    // Note: this covers some pre-Chromium Edge versions, 
    // but pre-Chromium Edge does not require SameSite=None.
    if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))
    {
        return true;
    }

    return false;
}

Testowanie aplikacji pod kątem problemów z usługą SameSite

Aplikacje, które wchodzą w interakcje z witrynami zdalnymi, takimi jak za pośrednictwem logowania innej firmy, muszą:

Przetestuj aplikacje internetowe przy użyciu wersji klienta, która może wyrazić zgodę na nowe SameSite zachowanie. Chrome, Firefox i Chromium Edge mają nowe flagi funkcji, które mogą być używane do testowania. Gdy aplikacja zastosuje poprawki, przetestuj SameSite ją ze starszymi wersjami klienta, zwłaszcza w przeglądarce Safari. Aby uzyskać więcej informacji, zobacz Obsługa starszych przeglądarek w tym dokumencie.

Testowanie za pomocą przeglądarki Chrome

Chrome 78+ daje mylące wyniki, ponieważ ma tymczasowe środki zaradcze. Tymczasowe środki zaradcze w przeglądarce Chrome 78+ pozwalają na używanie plików cookie mniej niż dwie minuty. Chrome 76 lub 77 z włączonymi odpowiednimi flagami testowymi zapewnia dokładniejsze wyniki. Aby przetestować nowe SameSite zachowanie, chrome://flags/#same-site-by-default-cookies przełączenie na włączone. Starsze wersje programu Chrome (75 i starsze) są zgłaszane jako nieudane z nowym None ustawieniem. Zobacz Obsługa starszych przeglądarek w tym dokumencie.

Firma Google nie udostępnia starszych wersji chrome. Postępuj zgodnie z instrukcjami w temacie Pobierz Chromium , aby przetestować starsze wersje przeglądarki Chrome. Nie pobieraj przeglądarki Chrome z linków udostępnianych przez wyszukiwanie starszych wersji przeglądarki Chrome.

Testowanie za pomocą przeglądarki Safari

Przeglądarka Safari 12 ściśle zaimplementowała poprzednią wersję roboczą i kończy się niepowodzeniem, gdy nowa None wartość znajduje się w pliku cookie. None jest unikany za pośrednictwem kodu wykrywania przeglądarki Obsługa starszych przeglądarek w tym dokumencie. Przetestuj logowania w stylu systemu operacyjnego Safari 12, Safari 13 i WebKit przy użyciu biblioteki MSAL lub dowolnej używanej biblioteki. Problem jest zależny od bazowej wersji systemu operacyjnego. OSX Mojave (10.14) i iOS 12 są znane ze zgodności z nowym SameSite zachowaniem. Uaktualnienie systemu operacyjnego do systemu OSX Catalina (10.15) lub iOS 13 rozwiązuje problem. Przeglądarka Safari nie ma obecnie flagi zgody na testowanie nowego zachowania specyfikacji.

Testowanie za pomocą przeglądarki Firefox

Obsługa przeglądarki Firefox dla nowego standardu można przetestować w wersji 68 lub nowszej, decydując się na about:config stronę z flagą network.cookie.sameSite.laxByDefaultfunkcji . Nie odnotowano raportów dotyczących problemów ze zgodnością ze starszymi wersjami przeglądarki Firefox.

Testowanie za pomocą przeglądarki Edge

Przeglądarka Edge obsługuje stary SameSite standard. Przeglądarka Edge w wersji 44 nie ma żadnych znanych problemów ze zgodnością z nowym standardem.

Testowanie za pomocą przeglądarki Edge (Chromium)

SameSite flagi są ustawiane na edge://flags/#same-site-by-default-cookies stronie. Nie odnaleziono żadnych problemów ze zgodnością z przeglądarką Edge Chromium.

Testowanie za pomocą elektronu

Wersje Electron obejmują starsze wersje Chromium. Na przykład wersja elektronu używana przez aplikację Teams to Chromium 66, która wykazuje starsze zachowanie. Musisz przeprowadzić własne testy zgodności z wersją używanej przez produkt Electron. Zobacz Obsługa starszych przeglądarek w poniższej sekcji.

Dodatkowe zasoby