Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
SameSite är en IETF-utkaststandard som utformats för att ge ett visst skydd mot csrf-attacker (cross-site request forgery). Ursprungligen utarbetad 2016, blev utkastet till standarden uppdaterat 2019. Den uppdaterade standarden är inte bakåtkompatibel med den tidigare standarden, och följande är de mest märkbara skillnaderna:
- Cookies utan SameSite-huvud behandlas som
SameSite=Laxstandard. -
SameSite=Nonemåste användas för att möjliggöra användning mellan webbplatser cookie. - Cookies som hävdar
SameSite=Nonemåste också markeras somSecure. - Applikationer som använder
<iframe>kan uppleva problem medsameSite=LaxellersameSite=Strictcookies eftersom<iframe>behandlas som scenarier mellan webbplatser. - Värdet
SameSite=Nonetillåts inte av 2016-standarden och gör att vissa implementeringar behandlar sådana cookies somSameSite=Strict. Se Stöd för äldre webbläsare i det här dokumentet.
Inställningen SameSite=Lax fungerar för de flesta programcookies. Vissa former av autentisering som OpenID Connect (OIDC) och WS-Federation är standard för POST-baserade omdirigeringar. Post-baserade omdirigeringar utlöser SameSite-webbläsarskydd, så SameSite inaktiveras för dessa komponenter. De flesta OAuth-inloggningar påverkas inte på grund av skillnader i hur begäran flödar.
Varje ASP.NET Core-komponent som genererar cookies måste avgöra om SameSite är lämpligt.
SameSite och Identity
ASP.NET Core Identity påverkas till stor del inte av SameSite-cookies förutom avancerade scenarier som IFrames eller OpenIdConnect integrering.
När du använder Identity, lägger du inte till några cookie leverantörer eller anropar services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme), Identity tar hand om det.
SameSite-testexempelkod
Följande exempel kan laddas ned och testas:
| Exempel | Dokument |
|---|---|
| .NET Core Razor Pages | ASP.NET Core 3.1 Razor Pages SameSite-exempel cookie |
.NET Core-stöd för attributet sameSite
.NET Core stöder 2019 års utkaststandard för SameSite. Utvecklare kan programmatiskt styra värdet för attributet sameSite med hjälp av HttpCookie.SameSite egenskapen . Om du anger SameSite-egenskapen till Strict, Lax eller None resulterar det i att dessa värden skrivs till nätverket med cookie. Genom att ställa in SameSiteMode.Unspecified anges att ingen sameSite ska skickas med cookie.
var cookieOptions = new CookieOptions
{
// Set the secure flag, which Chrome's changes will require for SameSite none.
// Note this will also require you to be running on HTTPS.
Secure = true,
// Set the cookie to HTTP only which is good practice unless you really do need
// to access it client side in scripts.
HttpOnly = true,
// Add the SameSite attribute, this will emit the attribute with a value of none.
SameSite = SameSiteMode.None
// The client should follow its default cookie policy.
// SameSite = SameSiteMode.Unspecified
};
// Add the cookie to the response cookie collection
Response.Cookies.Append("MyCookie", "cookieValue", cookieOptions);
}
API-användning med SameSite
HttpContext.Response.Cookies.Append är standardvärdet , vilket innebär att Unspecifiedinget SameSite-attribut läggs till cookie och klienten använder sitt standardbeteende (Lax för nya webbläsare, Ingen för gamla). Följande kod visar hur du ändrar värdet för cookie SameSite till SameSiteMode.Lax:
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
Alla ASP.NET Core-komponenter som genererar cookies åsidosätter de föregående standardvärdena med inställningar som är lämpliga för deras scenarier. De överordnade standardvärdena har inte ändrats.
| Komponent | cookie | Förinställning |
|---|---|---|
| CookieBuilder | SameSite | Unspecified |
| Session | SessionOptions.Cookie | Lax |
| CookieTempDataProvider | CookieTempDataProviderOptions.Cookie | Lax |
| IAntiforgery | AntiforgeryOptions.Cookie | Strict |
| Cookie Autentisering | CookieAuthenticationOptions.Cookie | Lax |
| AddTwitter | TwitterOptions.StateCookie | Lax |
| RemoteAuthenticationHandler<TOptions> | RemoteAuthenticationOptions.CorrelationCookie | None |
| AddOpenIdConnect | OpenIdConnectOptions.NonceCookie | None |
| HttpContext.Response.Cookies.Append | CookieOptions | Unspecified |
ASP.NET Core 3.1 eller senare tillhandahåller följande SameSite-stöd:
- Omdefinierar beteendet
SameSiteMode.Noneför att genereraSameSite=None - Lägger till ett nytt värde
SameSiteMode.Unspecifiedför att utelämna attributet SameSite. - Alla cookies-API:er är som standard
Unspecified. Vissa komponenter som använder cookies anger värden som är mer specifika för deras scenarier. Se tabellen ovan för exempel.
I ASP.NET Core 3.0 eller senare ändrades standardinställningarna för SameSite för att undvika konflikter med inkonsekventa klientstandarder. Följande API:er har ändrat standardvärdet från SameSiteMode.Lax till för att -1 undvika att generera ett SameSite-attribut för dessa cookies:
- CookieOptions används med HttpContext.Response.Cookies.Append
-
CookieBuilder används som fabrik för
CookieOptions - CookiePolicyOptions.MinimumSameSitePolicy
Historik och ändringar
SameSite-stödet implementerades först i ASP.NET Core i 2.0 med 2016 års utkaststandard. 2016-standarden var opt-in. ASP.NET Core valde att aktivera flera cookies som standard genom att ställa in dem till Lax. Efter att ha stött på flera problem med autentisering inaktiverades de flesta SameSite-användning.
Korrigeringar utfärdades i november 2019 för uppdatering från 2016-standarden till 2019-standarden. 2019 års utkast till SameSite-specifikationen:
- Är inte bakåtkompatibel med 2016 års utkast. Mer information finns i Stöd för äldre webbläsare i det här dokumentet.
- Anger att cookies behandlas som
SameSite=Laxsom standard. - Anger cookies som uttryckligen anger
SameSite=Noneför leverans över olika webbplatser ska markeras somSecure.Noneär en ny post att välja bort. - Stöds av korrigeringar som utfärdats för ASP.NET Core 2.1, 2.2 och 3.0. ASP.NET Core 3.1 eller senare har ytterligare Stöd för SameSite.
- Är schemalagd att aktiveras som standard i Chrome i februari 2020. Webbläsare började gå över till den här standarden under 2019.
API:er som påverkas av ändringen från 2016 års SameSite-utkaststandard till 2019 års utkaststandard
- Http.SameSiteMode
- CookieOptions.SameSite
- CookieBuilder.SameSite
- CookiePolicyOptions.MinimumSameSitePolicy
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
Stöd för äldre webbläsare
SameSite-standarden från 2016 gav i uppdrag att okända värden måste behandlas som SameSite=Strict värden. Appar som nås från äldre webbläsare som stöder 2016 års SameSite-standard kan sluta fungera korrekt när de får en SameSite-egenskap med värdet None. Webbappar måste implementera webbläsaridentifiering om de har för avsikt att stödja äldre webbläsare. ASP.NET Core implementerar inte webbläsaridentifiering eftersom User-Agents värden är mycket flyktiga och ändras ofta. Med en tilläggspunkt i Microsoft.AspNetCore.CookiePolicy kan man ansluta User-Agent-specifik logik.
I Program.cslägger du till kod som anropar UseCookiePolicy innan du anropar UseAuthentication eller någon metod som skriver cookies:
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
if (options.SameSite == SameSiteMode.None)
{
var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
}
}
builder.Services.AddRazorPages();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
I Program.cslägger du till kod som liknar följande markerade kod:
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
if (options.SameSite == SameSiteMode.None)
{
var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
}
}
builder.Services.AddRazorPages();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
I föregående exempel MyUserAgentDetectionLib.DisallowsSameSiteNone är ett bibliotek som tillhandahålls av användaren och som identifierar om användaragenten inte stöder SameSite None:
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
Följande kod visar en exempelmetod DisallowsSameSiteNone :
Varning
Följande kod är endast avsedd för demonstration:
- Den bör inte betraktas som fullständig.
- Den underhålls inte eller stöds inte.
public static bool DisallowsSameSiteNone(string userAgent)
{
// Check if a null or empty string has been passed in, since this
// will cause further interrogation of the useragent to fail.
if (String.IsNullOrWhiteSpace(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;
}
Testa appar för SameSite-problem
Appar som interagerar med fjärranslutna webbplatser, till exempel via inloggning från tredje part, måste:
- Testa interaktionen i flera webbläsare.
- Använd CookiePolicy-webbläsaridentifiering och hantering som diskuteras i det här dokumentet.
Testa webbappar med hjälp av en klientversion som kan välja det nya SameSite-beteendet. Chrome, Firefox och Chromium Edge har alla nya valfria funktioner som kan användas för testning. När appen har installerat SameSite-korrigeringarna testar du den med äldre klientversioner, särskilt Safari. Mer information finns i Stöd för äldre webbläsare i det här dokumentet.
Testa med Chrome
Chrome 78+ ger missvisande resultat eftersom det har en tillfällig åtgärd på plats. Den tillfälliga åtgärden Chrome 78+ tillåter cookies som är mindre än två minuter gamla. Chrome 76 eller 77 med lämpliga testflaggor aktiverade ger mer exakta resultat. Om du vill testa det nya SameSite-beteendet växlar du chrome://flags/#same-site-by-default-cookies till Aktiverad. Äldre versioner av Chrome (75 och senare) rapporteras misslyckas med den nya None inställningen. Se Stöd för äldre webbläsare i det här dokumentet.
Google gör inte äldre chrome-versioner tillgängliga. Följ anvisningarna i Ladda ned Chromium för att testa äldre versioner av Chrome. Ladda inte ned Chrome från länkar som tillhandahålls genom att söka efter äldre versioner av chrome.
Från och med canary-versionen 80.0.3975.0 kan den temporära åtgärden Lax+POST inaktiveras i testsyfte med hjälp av den nya flaggan --enable-features=SameSiteDefaultChecksMethodRigorously för att tillåta testning av webbplatser och tjänster i sluttillståndet för funktionen där åtgärden har tagits bort. För mer information, se SameSite-uppdateringar hos The Chromium Projects.
Testa med Safari
Safari 12 implementerade strikt det tidigare utkastet och misslyckas när det nya None värdet finns i en cookie.
None undviks via webbläsaridentifieringskoden Stöd för äldre webbläsare i det här dokumentet. Testa OS-baserade stilinloggningar i Safari 12, Safari 13 och WebKit med hjälp av MSAL, ADAL eller det bibliotek du använder. Problemet är beroende av den underliggande operativsystemversionen. OSX Mojave (10.14) och iOS 12 är kända för att ha kompatibilitetsproblem med det nya SameSite-beteendet. Om du uppgraderar operativsystemet till OSX Catalina (10.15) eller iOS 13 åtgärdas problemet. Safari har för närvarande ingen opt-in-flagga för att testa det nya specifikationsbeteendet.
Testa med Firefox
Firefox-stöd för den nya standarden kan testas på version 68+ genom att välja på about:config sidan med funktionsflaggan network.cookie.sameSite.laxByDefault. Det har inte förekommit rapporter om kompatibilitetsproblem med äldre versioner av Firefox.
Testa med Edge-webbläsare
Edge stöder den gamla SameSite-standarden. Edge version 44 har inga kända kompatibilitetsproblem med den nya standarden.
Testa med Edge (Chromium)
SameSite-flaggor anges på sidan edge://flags/#same-site-by-default-cookies . Inga kompatibilitetsproblem identifierades med Edge Chromium.
Testa med Electron
Versioner av Electron inkluderar äldre versioner av Chromium. Till exempel är den version av Electron som används av Teams Chromium 66, som uppvisar det äldre beteendet. Du måste utföra din egen kompatibilitetstestning med den version av Electron produkten som används. Se Stöd för äldre webbläsare i följande avsnitt.
Ytterligare resurser
- Chromium Blog: Utvecklare: Förbered er på nya SameSite=None; säkrar inställningarCookie
- Förklaring av SameSite cookies
- Korrigeringar för november 2019
| Exempel | Dokument |
|---|---|
| .NET Core Razor Pages | ASP.NET Core 3.1 Razor Pages SameSite-exempel cookie |
Följande exempel kan laddas ned och testas:
| Exempel | Dokument |
|---|---|
| .NET Core Razor Pages | ASP.NET Core 3.1 Razor Pages SameSite-exempel cookie |
.NET Core-stöd för attributet sameSite
.NET Core 3.1 eller senare stöder 2019 års utkaststandard för SameSite. Utvecklare kan programmatiskt styra värdet för attributet sameSite med hjälp av HttpCookie.SameSite egenskapen . Om du SameSite ställer in egenskapen på Strikt, Lax eller Ingen resulterar det i att dessa värden skrivs i nätverket med cookie. Genom att ställa in den till (SameSiteMode)(-1) anger man att inget sameSite-attribut ska inkluderas i nätverket med cookie.
var cookieOptions = new CookieOptions
{
// Set the secure flag, which Chrome's changes will require for SameSite none.
// Note this will also require you to be running on HTTPS.
Secure = true,
// Set the cookie to HTTP only which is good practice unless you really do need
// to access it client side in scripts.
HttpOnly = true,
// Add the SameSite attribute, this will emit the attribute with a value of none.
// To not emit the attribute at all set
// SameSite = (SameSiteMode)(-1)
SameSite = SameSiteMode.None
};
// Add the cookie to the response cookie collection
Response.Cookies.Append("MyCookie", "cookieValue", cookieOptions);
.NET Core 3.1 eller senare stöder de uppdaterade SameSite-värdena och lägger till ett extra värde till SameSiteMode.UnspecifiedSameSiteMode enum.
Det här nya värdet anger att ingen sameSite ska skickas med cookie.
API-användning med SameSite
HttpContext.Response.Cookies.Append är standardvärdet , vilket innebär att Unspecifiedinget SameSite-attribut läggs till cookie och klienten använder sitt standardbeteende (Lax för nya webbläsare, Ingen för gamla). Följande kod visar hur du ändrar värdet för cookie SameSite till SameSiteMode.Lax:
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
Alla ASP.NET Core-komponenter som genererar cookies åsidosätter de föregående standardvärdena med inställningar som är lämpliga för deras scenarier. De överordnade standardvärdena har inte ändrats.
| Komponent | cookie | Förinställning |
|---|---|---|
| CookieBuilder | SameSite | Unspecified |
| Session | SessionOptions.Cookie | Lax |
| CookieTempDataProvider | CookieTempDataProviderOptions.Cookie | Lax |
| IAntiforgery | AntiforgeryOptions.Cookie | Strict |
| Cookie Autentisering | CookieAuthenticationOptions.Cookie | Lax |
| AddTwitter | TwitterOptions.StateCookie | Lax |
| RemoteAuthenticationHandler<TOptions> | RemoteAuthenticationOptions.CorrelationCookie | None |
| AddOpenIdConnect | OpenIdConnectOptions.NonceCookie | None |
| HttpContext.Response.Cookies.Append | CookieOptions | Unspecified |
ASP.NET Core 3.1 eller senare tillhandahåller följande SameSite-stöd:
- Omdefinierar beteendet
SameSiteMode.Noneför att genereraSameSite=None - Lägger till ett nytt värde
SameSiteMode.Unspecifiedför att utelämna attributet SameSite. - Alla cookies-API:er är som standard
Unspecified. Vissa komponenter som använder cookies anger värden som är mer specifika för deras scenarier. Se tabellen ovan för exempel.
I ASP.NET Core 3.0 eller senare ändrades standardinställningarna för SameSite för att undvika konflikter med inkonsekventa klientstandarder. Följande API:er har ändrat standardvärdet från SameSiteMode.Lax till för att -1 undvika att generera ett SameSite-attribut för dessa cookies:
- CookieOptions används med HttpContext.Response.Cookies.Append
-
CookieBuilder används som fabrik för
CookieOptions - CookiePolicyOptions.MinimumSameSitePolicy
Historik och ändringar
SameSite-stödet implementerades först i ASP.NET Core i 2.0 med 2016 års utkaststandard. 2016-standarden var opt-in. ASP.NET Core valde att aktivera flera cookies som standard genom att ställa in dem till Lax. Efter att ha stött på flera problem med autentisering inaktiverades de flesta SameSite-användning.
Korrigeringar utfärdades i november 2019 för uppdatering från 2016-standarden till 2019-standarden. 2019 års utkast till SameSite-specifikationen:
- Är inte bakåtkompatibel med 2016 års utkast. Mer information finns i Stöd för äldre webbläsare i det här dokumentet.
- Anger att cookies behandlas som
SameSite=Laxsom standard. - Anger cookies som uttryckligen anger
SameSite=Noneför leverans över olika webbplatser ska markeras somSecure.Noneär en ny post att välja bort. - Stöds av korrigeringar som utfärdats för ASP.NET Core 2.1, 2.2 och 3.0. ASP.NET Core 3.1 har ytterligare Stöd för SameSite.
- Är schemalagd att aktiveras som standard i Chrome i februari 2020. Webbläsare började gå över till den här standarden under 2019.
API:er som påverkas av ändringen från 2016 års SameSite-utkaststandard till 2019 års utkaststandard
- Http.SameSiteMode
- CookieOptions.SameSite
- CookieBuilder.SameSite
- CookiePolicyOptions.MinimumSameSitePolicy
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
Stöd för äldre webbläsare
SameSite-standarden från 2016 gav i uppdrag att okända värden måste behandlas som SameSite=Strict värden. Appar som nås från äldre webbläsare som stöder 2016 års SameSite-standard kan sluta fungera korrekt när de får en SameSite-egenskap med värdet None. Webbappar måste implementera webbläsaridentifiering om de har för avsikt att stödja äldre webbläsare. ASP.NET Core implementerar inte webbläsaridentifiering eftersom User-Agents värden är mycket flyktiga och ändras ofta. Med en tilläggspunkt i Microsoft.AspNetCore.CookiePolicy kan man ansluta User-Agent-specifik logik.
I Startup.Configurelägger du till kod som anropar UseCookiePolicy innan du anropar UseAuthentication eller någon metod som skriver cookies:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
I Startup.ConfigureServiceslägger du till kod som liknar följande:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
services.AddRazorPages();
}
private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
if (options.SameSite == SameSiteMode.None)
{
var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
}
}
I föregående exempel MyUserAgentDetectionLib.DisallowsSameSiteNone är ett bibliotek som tillhandahålls av användaren och som identifierar om användaragenten inte stöder SameSite None:
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
Följande kod visar en exempelmetod DisallowsSameSiteNone :
Varning
Följande kod är endast avsedd för demonstration:
- Den bör inte betraktas som fullständig.
- Den underhålls inte eller stöds inte.
public static bool DisallowsSameSiteNone(string userAgent)
{
// Check if a null or empty string has been passed in, since this
// will cause further interrogation of the useragent to fail.
if (String.IsNullOrWhiteSpace(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;
}
Testa appar för SameSite-problem
Appar som interagerar med fjärranslutna webbplatser, till exempel via inloggning från tredje part, måste:
- Testa interaktionen i flera webbläsare.
- Använd CookiePolicy-webbläsaridentifiering och hantering som diskuteras i det här dokumentet.
Testa webbappar med hjälp av en klientversion som kan välja det nya SameSite-beteendet. Chrome, Firefox och Chromium Edge har alla nya valfria funktioner som kan användas för testning. När appen har installerat SameSite-korrigeringarna testar du den med äldre klientversioner, särskilt Safari. Mer information finns i Stöd för äldre webbläsare i det här dokumentet.
Testa med Chrome
Chrome 78+ ger missvisande resultat eftersom det har en tillfällig åtgärd på plats. Den tillfälliga åtgärden Chrome 78+ tillåter cookies som är mindre än två minuter gamla. Chrome 76 eller 77 med lämpliga testflaggor aktiverade ger mer exakta resultat. Om du vill testa det nya SameSite-beteendet växlar du chrome://flags/#same-site-by-default-cookies till Aktiverad. Äldre versioner av Chrome (75 och senare) rapporteras misslyckas med den nya None inställningen. Se Stöd för äldre webbläsare i det här dokumentet.
Google gör inte äldre chrome-versioner tillgängliga. Följ anvisningarna i Ladda ned Chromium för att testa äldre versioner av Chrome. Ladda inte ned Chrome från länkar som tillhandahålls genom att söka efter äldre versioner av chrome.
Från och med canary-versionen 80.0.3975.0 kan den temporära åtgärden Lax+POST inaktiveras i testsyfte med hjälp av den nya flaggan --enable-features=SameSiteDefaultChecksMethodRigorously för att tillåta testning av webbplatser och tjänster i sluttillståndet för funktionen där åtgärden har tagits bort. För mer information, se SameSite-uppdateringar hos The Chromium Projects.
Testa med Safari
Safari 12 implementerade strikt det tidigare utkastet och misslyckas när det nya None värdet finns i en cookie.
None undviks via webbläsaridentifieringskoden Stöd för äldre webbläsare i det här dokumentet. Testa OS-baserade stilinloggningar i Safari 12, Safari 13 och WebKit med hjälp av MSAL, ADAL eller det bibliotek du använder. Problemet är beroende av den underliggande operativsystemversionen. OSX Mojave (10.14) och iOS 12 är kända för att ha kompatibilitetsproblem med det nya SameSite-beteendet. Om du uppgraderar operativsystemet till OSX Catalina (10.15) eller iOS 13 åtgärdas problemet. Safari har för närvarande ingen opt-in-flagga för att testa det nya specifikationsbeteendet.
Testa med Firefox
Firefox-stöd för den nya standarden kan testas på version 68+ genom att välja på about:config sidan med funktionsflaggan network.cookie.sameSite.laxByDefault. Det har inte förekommit rapporter om kompatibilitetsproblem med äldre versioner av Firefox.
Testa med Edge-webbläsare
Edge stöder den gamla SameSite-standarden. Edge version 44 har inga kända kompatibilitetsproblem med den nya standarden.
Testa med Edge (Chromium)
SameSite-flaggor anges på sidan edge://flags/#same-site-by-default-cookies . Inga kompatibilitetsproblem identifierades med Edge Chromium.
Testa med Electron
Versioner av Electron inkluderar äldre versioner av Chromium. Till exempel är den version av Electron som används av Teams Chromium 66, som uppvisar det äldre beteendet. Du måste utföra din egen kompatibilitetstestning med den version av Electron produkten som används. Se Stöd för äldre webbläsare i följande avsnitt.
Ytterligare resurser
- Chromium Blog: Utvecklare: Förbered er på nya SameSite=None; säkrar inställningarCookie
- Förklaring av SameSite cookies
- Korrigeringar för november 2019
| Exempel | Dokument |
|---|---|
| .NET Core Razor Pages | ASP.NET Core 3.1 Razor Pages SameSite-exempel cookie |
Följande exempel kan laddas ned och testas:
| Exempel | Dokument |
|---|---|
| .NET Core MVC | ASP.NET Core 2.1 MVC SameSite-exempel cookie |
| .NET Core Razor Pages | ASP.NET Core 2.1 Razor Pages SameSite-exempel cookie |
Beteendeförändringar i decemberuppdateringar
Beteendeändringen för .NET Framework och .NET Core 2.1 är specifikt hur egenskapen SameSite tolkar värdet None. Innan korrigeringen betyder värdet None "Generera inte attributet alls" efter korrigeringen betyder det "Generera attributet med värdet None". Efter korrigeringen gör ett SameSite värde av (SameSiteMode)(-1) att attributet inte blir emitterat.
Standardvärdet för SameSite för formulärautentisering och sessionstillståndscookies ändrades från None till Lax.
API-användning med SameSite
HttpContext.Response.Cookies.Append är standardvärdet , vilket innebär att Unspecifiedinget SameSite-attribut läggs till cookie och klienten använder sitt standardbeteende (Lax för nya webbläsare, Ingen för gamla). Följande kod visar hur du ändrar värdet för cookie SameSite till SameSiteMode.Lax:
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
Alla ASP.NET Core-komponenter som genererar cookies åsidosätter de föregående standardvärdena med inställningar som är lämpliga för deras scenarier. De överordnade standardvärdena har inte ändrats.
| Komponent | cookie | Förinställning |
|---|---|---|
| CookieBuilder | SameSite | Unspecified |
| Session | SessionOptions.Cookie | Lax |
| CookieTempDataProvider | CookieTempDataProviderOptions.Cookie | Lax |
| IAntiforgery | AntiforgeryOptions.Cookie | Strict |
| Cookie Autentisering | CookieAuthenticationOptions.Cookie | Lax |
| AddTwitter | TwitterOptions.StateCookie | Lax |
| RemoteAuthenticationHandler<TOptions> | RemoteAuthenticationOptions.CorrelationCookie | None |
| AddOpenIdConnect | OpenIdConnectOptions.NonceCookie | None |
| HttpContext.Response.Cookies.Append | CookieOptions | Unspecified |
Historik och ändringar
SameSite-stödet implementerades först i ASP.NET Core i 2.0 med 2016 års utkaststandard. 2016-standarden var opt-in. ASP.NET Core valde att aktivera flera cookies som standard genom att ställa in dem till Lax. Efter att ha stött på flera problem med autentisering inaktiverades de flesta SameSite-användning.
Korrigeringar utfärdades i november 2019 för uppdatering från 2016-standarden till 2019-standarden. 2019 års utkast till SameSite-specifikationen:
- Är inte bakåtkompatibel med 2016 års utkast. Mer information finns i Stöd för äldre webbläsare i det här dokumentet.
- Anger att cookies behandlas som
SameSite=Laxsom standard. - Anger cookies som uttryckligen anger
SameSite=Noneför leverans över olika webbplatser ska markeras somSecure.Noneär en ny post att välja bort. - Stöds av korrigeringar som utfärdats för ASP.NET Core 2.1, 2.2 och 3.0. ASP.NET Core 3.1 har ytterligare Stöd för SameSite.
- Är schemalagd att aktiveras som standard i Chrome i februari 2020. Webbläsare började gå över till den här standarden under 2019.
API:er som påverkas av ändringen från 2016 års SameSite-utkaststandard till 2019 års utkaststandard
- Http.SameSiteMode
- CookieOptions.SameSite
- CookieBuilder.SameSite
- CookiePolicyOptions.MinimumSameSitePolicy
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
Stöd för äldre webbläsare
SameSite-standarden från 2016 gav i uppdrag att okända värden måste behandlas som SameSite=Strict värden. Appar som nås från äldre webbläsare som stöder 2016 års SameSite-standard kan sluta fungera korrekt när de får en SameSite-egenskap med värdet None. Webbappar måste implementera webbläsaridentifiering om de har för avsikt att stödja äldre webbläsare. ASP.NET Core implementerar inte webbläsaridentifiering eftersom User-Agents värden är mycket flyktiga och ändras ofta. Med en tilläggspunkt i Microsoft.AspNetCore.CookiePolicy kan man ansluta User-Agent-specifik logik.
I Startup.Configurelägger du till kod som anropar UseCookiePolicy innan du anropar UseAuthentication eller någon metod som skriver cookies:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
I Startup.ConfigureServiceslägger du till kod som liknar följande:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = (SameSiteMode)(-1);
options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
services.AddRazorPages();
}
private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
if (options.SameSite == SameSiteMode.None)
{
var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = (SameSiteMode)(-1);
}
}
}
I föregående exempel MyUserAgentDetectionLib.DisallowsSameSiteNone är ett bibliotek som tillhandahålls av användaren och som identifierar om användaragenten inte stöder SameSite None:
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
Följande kod visar en exempelmetod DisallowsSameSiteNone :
Varning
Följande kod är endast avsedd för demonstration:
- Den bör inte betraktas som fullständig.
- Den underhålls inte eller stöds inte.
public static bool DisallowsSameSiteNone(string userAgent)
{
// Check if a null or empty string has been passed in, since this
// will cause further interrogation of the useragent to fail.
if (String.IsNullOrWhiteSpace(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;
}
Testa appar för SameSite-problem
Appar som interagerar med fjärranslutna webbplatser, till exempel via inloggning från tredje part, måste:
- Testa interaktionen i flera webbläsare.
- Använd CookiePolicy-webbläsaridentifiering och hantering som diskuteras i det här dokumentet.
Testa webbappar med hjälp av en klientversion som kan välja det nya SameSite-beteendet. Chrome, Firefox och Chromium Edge har alla nya valfria funktioner som kan användas för testning. När appen har installerat SameSite-korrigeringarna testar du den med äldre klientversioner, särskilt Safari. Mer information finns i Stöd för äldre webbläsare i det här dokumentet.
Testa med Chrome
Chrome 78+ ger missvisande resultat eftersom det har en tillfällig åtgärd på plats. Den tillfälliga åtgärden Chrome 78+ tillåter cookies som är mindre än två minuter gamla. Chrome 76 eller 77 med lämpliga testflaggor aktiverade ger mer exakta resultat. Om du vill testa det nya SameSite-beteendet växlar du chrome://flags/#same-site-by-default-cookies till Aktiverad. Äldre versioner av Chrome (75 och senare) rapporteras misslyckas med den nya None inställningen. Se Stöd för äldre webbläsare i det här dokumentet.
Google gör inte äldre chrome-versioner tillgängliga. Följ anvisningarna i Ladda ned Chromium för att testa äldre versioner av Chrome. Ladda inte ned Chrome från länkar som tillhandahålls genom att söka efter äldre versioner av chrome.
Från och med canary-versionen 80.0.3975.0 kan den temporära åtgärden Lax+POST inaktiveras i testsyfte med hjälp av den nya flaggan --enable-features=SameSiteDefaultChecksMethodRigorously för att tillåta testning av webbplatser och tjänster i sluttillståndet för funktionen där åtgärden har tagits bort. För mer information, se SameSite-uppdateringar hos The Chromium Projects.
Testa med Safari
Safari 12 implementerade strikt det tidigare utkastet och misslyckas när det nya None värdet finns i en cookie.
None undviks via webbläsaridentifieringskoden Stöd för äldre webbläsare i det här dokumentet. Testa OS-baserade stilinloggningar i Safari 12, Safari 13 och WebKit med hjälp av MSAL, ADAL eller det bibliotek du använder. Problemet är beroende av den underliggande operativsystemversionen. OSX Mojave (10.14) och iOS 12 är kända för att ha kompatibilitetsproblem med det nya SameSite-beteendet. Om du uppgraderar operativsystemet till OSX Catalina (10.15) eller iOS 13 åtgärdas problemet. Safari har för närvarande ingen opt-in-flagga för att testa det nya specifikationsbeteendet.
Testa med Firefox
Firefox-stöd för den nya standarden kan testas på version 68+ genom att välja på about:config sidan med funktionsflaggan network.cookie.sameSite.laxByDefault. Det har inte förekommit rapporter om kompatibilitetsproblem med äldre versioner av Firefox.
Testa med Edge-webbläsare
Edge stöder den gamla SameSite-standarden. Edge version 44 har inga kända kompatibilitetsproblem med den nya standarden.
Testa med Edge (Chromium)
SameSite-flaggor anges på sidan edge://flags/#same-site-by-default-cookies . Inga kompatibilitetsproblem identifierades med Edge Chromium.
Testa med Electron
Versioner av Electron inkluderar äldre versioner av Chromium. Till exempel är den version av Electron som används av Teams Chromium 66, som uppvisar det äldre beteendet. Du måste utföra din egen kompatibilitetstestning med den version av Electron produkten som används. Se Stöd för äldre webbläsare i följande avsnitt.
Ytterligare resurser
- Chromium Blog: Utvecklare: Förbered er på nya SameSite=None; säkrar inställningarCookie
- Förklaring av SameSite cookies
- Korrigeringar för november 2019
| Exempel | Dokument |
|---|---|
| .NET Core MVC | ASP.NET Core 2.1 MVC SameSite-exempel cookie |
| .NET Core Razor Pages | ASP.NET Core 2.1 Razor Pages SameSite-exempel cookie |
ASP.NET Core