Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Autor: Rick Anderson
SameSite
je koncept IETF navržený tak, aby poskytoval určitou ochranu před útoky csrF (cross-site request forgery). Koncept SameSite 2019:
- Považuje soubory cookie za
SameSite=Lax
výchozí. - Uvádí soubory cookie, které výslovně uplatňují
SameSite=None
, aby bylo možné povolit doručování mezi weby, by měly být označeny jakoSecure
.
Lax
funguje pro většinu souborů cookie aplikace. Některé formy ověřování, jako je OpenID Connect (OIDC) a WS-Federation , jsou ve výchozím nastavení přesměrování založené na POST. Přesměrování založená na POST aktivují SameSite
ochranu prohlížeče, takže SameSite
je pro tyto komponenty zakázaná. Většina přihlášení OAuth nemá vliv na rozdíly ve způsobu toku požadavků. Všechny ostatní komponenty ve výchozím nastavení nenastavují SameSite
a používají výchozí chování klientů (staré nebo nové).
Parametr None
způsobuje problémy s kompatibilitou s klienty, kteří implementovali předchozí standard konceptu 2016 (například iOS 12). Viz Podpora starších prohlížečů v tomto dokumentu.
Každá komponenta OWIN, která generuje soubory cookie, se musí rozhodnout, jestli SameSite
je to vhodné.
Informace o verzi ASP.NET 4.x tohoto článku najdete v tématu Práce se soubory cookie SameSite v ASP.NET.
Využití rozhraní API se samesitem
Microsoft.Owin
má vlastní SameSite
implementaci:
- To není přímo závislé na té v
System.Web
. SameSite
funguje na všech verzích, na kteréMicrosoft.Owin
lze cílit balíčky, .NET 4.5 a novější.- S třídou přímo komunikuje
System.Web
HttpCookie
pouze komponenta SystemWebCookieManager.
SystemWebCookieManager
závisí na rozhraníCH API .NET 4.7.2 System.Web
, která umožňují SameSite
podporu, a opravách, které změní chování.
Důvody použití SystemWebCookieManager
jsou popsané v problémech s integrací souborů cookie odpovědi OWIN a System.Web. SystemWebCookieManager
se doporučuje při spuštění .System.Web
Následující kód nastavíSameSite
:Lax
owinContext.Response.Cookies.Append("My Key", "My Value", new CookieOptions()
{
SameSite = SameSiteMode.Lax
});
Následující rozhraní API používají SameSite
:
- Microsoft.Owin.SameSiteMode
- CookieOptions.SameSite
- CookieAuthenticationOptions – třída
- CookieAuthenticationOptions.CookieSameSite
- ICookieManager
- SystemWebCookieManager
- SystemWebChunkingCookieManager
- CookieAuthenticationOptions.CookieManager
- OpenIdConnectAuthenticationOptions.CookieManager
Historie a změny
Microsoft.Owin nikdy nepodporuje SameSite
koncept standardu 2016.
Podpora konceptu SameSite 2019 je dostupná pouze ve Microsoft.Owin
verzi 4.1.0 a novější. Pro předchozí verze nejsou k dispozici žádné opravy.
Návrh specifikace z roku 2019 SameSite
:
- Není zpětně kompatibilní s konceptem 2016. Další informace naleznete v tématu Podpora starších prohlížečů v tomto dokumentu.
- Určuje soubory cookie, které jsou ve
SameSite=Lax
výchozím nastavení zpracovávány. - Určuje soubory cookie, které explicitně uplatňují
SameSite=None
, aby bylo možné povolit doručování mezi weby, by mělo být označeno jakoSecure
.None
je nová položka pro odhlášení. - Ve výchozím nastavení je v únoru 2020 naplánované, aby ho chrome povolil. Prohlížeče začaly v roce 2019 přejít na tento standard.
- Podporuje se opravami vydanými podle popisu v článcích znalostní báze. Další informace naleznete v článcích znalostní báze, které podporují SameSite v rozhraní .NET Framework.
Podpora starších prohlížečů
Standard 2016 SameSite
nařídil, že neznámé hodnoty musí být považovány za SameSite=Strict
hodnoty. Aplikace, ke kterým se přistupuje ze starších prohlížečů, které podporují standard 2016 SameSite
, se můžou přerušit, když získají SameSite
vlastnost s hodnotou None
. Webové aplikace musí implementovat detekci prohlížeče, pokud mají v úmyslu podporovat starší prohlížeče. ASP.NET neimplementuje detekci prohlížeče, protože hodnoty User-Agents jsou vysoce nestálé a často se mění. Bod rozšíření v ICookieManager umožňuje připojit logiku specifickou pro uživatele agenta.
Do Startup.Configuration
pole přidejte kód podobný následujícímu:
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.
Předchozí kód vyžaduje opravu .NET 4.7.2 nebo novější SameSite
.
Následující kód ukazuje ukázkovou implementaci 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;
}
}
V předchozím vzorku se DisallowsSameSiteNone
volá v CheckSameSite
metodě. DisallowsSameSiteNone
je uživatelská metoda, která zjistí, jestli uživatelský agent nepodporuje SameSite
None
:
private void CheckSameSite(IOwinContext context, CookieOptions options)
{
if (options.SameSite == Microsoft.Owin.SameSiteMode.None
&& DisallowsSameSiteNone(context))
{
options.SameSite = null;
}
}
Následující kód ukazuje ukázkovou DisallowsSameSiteNone
metodu:
Upozorňující
Následující kód je určen pouze pro ukázku:
- Nemělo by se považovat za dokončené.
- Neudržuje se ani nepodporuje.
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;
}
Testování aplikací pro problémy se samesitem
Aplikace, které komunikují se vzdálenými weby, jako je přihlášení třetích stran, musí:
- Otestujte interakci v několika prohlížečích.
- Použijte detekci a zmírnění rizik prohlížeče popsané v tomto dokumentu.
Otestujte webové aplikace pomocí klientské verze, která se může přihlásit k novému SameSite
chování. Chrome, Firefox a Chromium Edge mají nové příznaky funkce opt-in, které je možné použít k testování. Jakmile aplikace použije SameSite
opravy, otestujte ji ve starších verzích klienta, zejména v Safari. Další informace naleznete v tématu Podpora starších prohlížečů v tomto dokumentu.
Testování pomocí Chromu
Chrome 78+ poskytuje zavádějící výsledky, protože má dočasné zmírnění rizik. Dočasné zmírnění rizik pro Chrome 78+ umožňuje soubory cookie starší než dvě minuty. Chrome 76 nebo 77 s povolenými příslušnými testovacími příznaky poskytuje přesnější výsledky. Pokud chcete otestovat nové SameSite
chování, přepněte chrome://flags/#same-site-by-default-cookies
na Povoleno. Starší verze Chromu (75 a novější) se hlásí, že selhávají s novým None
nastavením. Viz Podpora starších prohlížečů v tomto dokumentu.
Google nezpřístupní starší verze chromu. Postupujte podle pokynů ke stažení Chromium a otestujte starší verze Chromu. Nestahujte Chrome z odkazů poskytovaných vyhledáváním starších verzí chromu.
Testování pomocí Safari
Safari 12 striktně implementoval předchozí koncept a selže, když je nová None
hodnota v souboru cookie. None
se vyhnete prostřednictvím kódu detekce prohlížeče podporujícího starší prohlížeče v tomto dokumentu. Otestujte přihlášení stylu operačního systému Založené na Prohlížeči Safari 12, Safari 13 a WebKitu pomocí knihovny MSAL nebo knihovny, kterou používáte. Problém závisí na základní verzi operačního systému. OSX Mojave (10.14) a iOS 12 znají problémy s kompatibilitou s novým SameSite
chováním. Problém řeší upgrade operačního systému na OSX Catalina (10.15) nebo iOS 13. Safari momentálně nemá příznak výslovného souhlasu pro testování nového chování specifikace.
Testování ve Firefoxu
Podporu Firefoxu pro nový standard lze testovat na verzi 68+ výslovným souhlasem na about:config
stránce s příznakem network.cookie.sameSite.laxByDefault
funkce . Ve starších verzích Firefoxu nebyly hlášeny problémy s kompatibilitou.
Testování v prohlížeči Edge
Edge podporuje starý SameSite
standard. Edge verze 44 nemá žádné známé problémy s kompatibilitou s novým standardem.
Testování s edgem (Chromium)
SameSite
na stránce jsou nastaveny edge://flags/#same-site-by-default-cookies
příznaky. U Edge Chromium nebyly zjištěny žádné problémy s kompatibilitou.
Test s elektronem
Verze Elektronu zahrnují starší verze Chromium. Například verze Elektronu, kterou teams používá, je Chromium 66, který vykazuje starší chování. Musíte provést vlastní testování kompatibility s verzí elektronu, kterou váš produkt používá. Viz Podpora starších prohlížečů v následující části.