Pliki cookie sameSite i interfejs Open Web Interface for .NET (OWIN)
Autor: Rick Anderson
SameSite
jest 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 jakoSecure
.
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 nie są domyś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.
Microsoft.Owin
ma własną implementację SameSite
:
- Nie jest to bezpośrednio zależne od elementu w
System.Web
programie . SameSite
działa na wszystkich wersjach docelowych przezMicrosoft.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
:
- Microsoft.Owin.SameSiteMode
- CookieOptions.SameSite
- CookieAuthenticationOptions, klasa
- CookieAuthenticationOptions.CookieSameSite
- ICookieManager
- SystemWebCookieManager
- SystemWebChunkingCookieManager
- CookieAuthenticationOptions.CookieManager
- OpenIdConnectAuthenticationOptions.CookieManager
Microsoft.Owin nigdy nie obsługiwał wersji roboczej standardu SameSite
2016.
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.:
- Nie jest do tyłu zgodny z wersją roboczą z 2016 roku. Aby uzyskać więcej informacji, zobacz Obsługa starszych przeglądarek w tym dokumencie.
- Określa, że pliki cookie są domyślnie traktowane jako
SameSite=Lax
. - Określa pliki cookie, które jawnie asertywne
SameSite=None
w celu włączenia dostarczania między witrynami powinny być oznaczone jakoSecure
.None
jest nowym wpisem, aby zrezygnować. - Program Chrome ma być domyślnie włączony w lutym 2020 roku. Przeglądarki zaczęły przechodzić do tego standardu w 2019 roku.
- Jest obsługiwany przez poprawki wydane zgodnie z opisem w artykułach BAZY wiedzy. Aby uzyskać więcej informacji, zobacz artykuły bazy wiedzy, które obsługują witrynę SameSite w programie .NET Framework.
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.Configuration
pliku 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
None
programu :
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;
}
Aplikacje, które wchodzą w interakcje z witrynami zdalnymi, takimi jak za pośrednictwem logowania innej firmy, muszą:
- Przetestuj interakcję w wielu przeglądarkach.
- Zastosuj wykrywanie przeglądarki i środki zaradcze omówione w tym dokumencie.
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.
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.
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.
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.laxByDefault
funkcji . Nie odnotowano raportów dotyczących problemów ze zgodnością ze starszymi wersjami przeglądarki Firefox.
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.
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.
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.