Arbeiten mit SameSites cookiein ASP.NET Core
Von Rick Anderson
SameSite ist ein IETF-Entwurfsstandard , der einen Schutz vor Websiteanforderungs-Forgery-Angriffen (CSRF) bietet. Ursprünglich im Jahr 2016 wurde der Entwurfsstandard 2019 aktualisiert. Der aktualisierte Standard ist nicht abwärtskompatibel mit dem vorherigen Standard, wobei folgendes die wichtigsten Unterschiede ist:
- Cookies ohne SameSite-Header werden standardmäßig behandelt
SameSite=Lax
. SameSite=None
muss verwendet werden, um websiteübergreifende cookie Verwendung zu ermöglichen.- Cookies, dass die Durchsetzung
SameSite=None
auch als gekennzeichnetSecure
werden muss. - Anwendungen, die
<iframe>
verwenden, können Probleme mitsameSite=Lax
odersameSite=Strict
cookies auftreten, da<iframe>
sie als websiteübergreifende Szenarien behandelt werden. - Der Wert
SameSite=None
ist vom Standard 2016 nicht zulässig und verursacht einige Implementierungen, wie zcookieSameSite=Strict
. B. . Siehe Unterstützung älterer Browser in diesem Dokument.
Die SameSite=Lax
Einstellung funktioniert für die meisten Anwendungen cookie. Einige Formen der Authentifizierung wie OpenID Connect (OIDC) und WS-Verbundstandard für POST-basierte Umleitungen. Die postbasierten Umleitungen lösen den SameSite-Browserschutz aus, sodass SameSite für diese Komponenten deaktiviert ist. Die meisten OAuth-Anmeldungen sind aufgrund von Unterschieden, wie die Anforderung fließt, nicht betroffen.
Jede ASP.NET Core Komponente, die emittiertcookie, muss entscheiden, ob SameSite geeignet ist.
SameSite und Identity
Identity ASP.NET Core ist von SameSites cookie außer für erweiterte Szenarien wie IFrames
oder OpenIdConnect
Integration weitgehend unberührt.
Beim Verwenden Identity
von , fügen cookie Sie keine Anbieter oder Anrufe services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
hinzu, Identity
übernimmt dies.
SameSite-Testbeispielcode
Das folgende Beispiel kann heruntergeladen und getestet werden:
Beispiel | Dokument |
---|---|
.NET Core-Seiten Razor | ASP.NET Core 3.1 Razor Pages SameSite-Beispiel cookie |
.NET Core-Unterstützung für das gleicheSite-Attribut
.NET Core unterstützt den Entwurfsstandard 2019 für SameSite. Entwickler können den Wert desselbenSite-Attributs mit der HttpCookie.SameSite
Eigenschaft programmgesteuert steuern. Legen Sie die Eigenschaft auf , oder None
führt dazu, dass diese SameSite
Werte im Netzwerk mit dem cookieLax
.Strict
Einstellung, um SameSiteMode.Unspecified
keine gleiche Website anzugeben, sollte mit dem 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-Verwendung mit SameSite
HttpContext.Response.Cookie s.Append standardmäßig an Unspecified
, d. h. kein SameSite-Attribut, das dem cookie Client hinzugefügt wurde, und der Client verwendet sein Standardverhalten (Lax für neue Browser, Keine für alte). Im folgenden Code wird gezeigt, wie Sie den cookie SameSite-Wert in SameSiteMode.Lax
:
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
Alle ASP.NET Core Komponenten, die die vorhergehenden Standardeinstellungen außer cookieKraft setzen, die für ihre Szenarien geeignet sind. Die vorhergehenden Standardwerte wurden nicht geändert.
ASP.NET Core 3.1 und höher bietet den folgenden SameSite-Support:
- Definiert das Verhalten des
SameSiteMode.None
Emittierens neu.SameSite=None
- Fügt einen neuen Wert
SameSiteMode.Unspecified
hinzu, um das SameSite-Attribut auszulassen. - Alle cookieAPIs standardmäßig auf
Unspecified
. Einige Komponenten, die bestimmte Werte für ihre Szenarien verwenden cookie. In der obigen Tabelle finden Sie Beispiele.
In ASP.NET Core 3.0 und höher wurden die SameSite-Standardeinstellungen geändert, um Konflikte mit inkonsistenten Clientstandarden zu vermeiden. Die folgenden APIs haben die Standardeinstellung SameSiteMode.Lax
geändert, -1
um ein SameSite-Attribut für diese cookies zu vermeiden:
- CookieOptions wird mit HttpContext.Response verwendet.Cookie s.Append
- CookieBuilder verwendet als Fabrik für
CookieOptions
- CookiePolicyOptions.MinimumSameSitePolicy
Verlauf und Änderungen
Die SameSite-Unterstützung wurde zuerst in ASP.NET Core in 2.0 mit dem 2016-Entwurfsstandard implementiert. Der Standard 2016 war opt-in. ASP.NET Core aktiviert, indem sie standardmäßig mehrere cookies Lax
festlegen. Nachdem mehrere Probleme mit der Authentifizierung auftreten, wurde die meisten Verwendung von SameSite deaktiviert.
Patches wurden im November 2019 ausgestellt, um vom Standard 2016 auf den Standard 2019 zu aktualisieren. Der Entwurf der SameSite-Spezifikation 2019:
- Ist nicht rückwärts kompatibel mit dem Entwurf von 2016. Weitere Informationen finden Sie unter Unterstützen älterer Browser in diesem Dokument.
- Gibt cookiean, dass s standardmäßig behandelt
SameSite=Lax
werden. - Gibt s an cookie, die explizit geltend
SameSite=None
gemacht werden, um die Websitebereitstellung zu aktivieren, alsSecure
gekennzeichnet werden soll.None
ist ein neuer Eintrag zum Abmelden. - Wird von Patches unterstützt, die für ASP.NET Core 2.1, 2.2 und 3.0 ausgestellt wurden. ASP.NET Core 3.1 und höher bietet zusätzliche Unterstützung für SameSite.
- Ist geplant, dass chrome standardmäßig im Februar 2020 aktiviert wird. Browser haben im Jahr 2019 mit der Umstellung auf diesen Standard begonnen.
APIs, die durch die Änderung des Standards vom 2016 SameSite-Entwurf in den Standard 2019 beeinflusst wurden
- Http.SameSiteMode
- CookieOptions.SameSite
- CookieGenerator.SameSite
- CookiePolicyOptions.MinimumSameSitePolicy
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
Unterstützen von älteren Browsern
Der 2016 SameSite-Standard, der unbekannten Werte als SameSite=Strict
Werte behandelt werden muss. Apps, auf die von älteren Browsern zugegriffen werden, die den Standard 2016 SameSite unterstützen, können unterbrochen werden, wenn sie eine SameSite-Eigenschaft mit einem Wert None
erhalten. Web-Apps müssen Browsererkennung implementieren, wenn sie ältere Browser unterstützen möchten. ASP.NET Core implementiert die Browsererkennung nicht, da User-Agents Werte stark veränderlich sind und häufig geändert werden. Ein Erweiterungspunkt in Microsoft.AspNetCore.CookiePolicy ermöglicht das Einstecken User-Agent spezifischer Logik.
Program.cs
Fügen Sie in , Code hinzu, der vor dem Aufrufen UseAuthentication oder einer beliebigen Methode aufgerufen UseCookiePolicy wird, die s schreibtcookie:
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();
Program.cs
Fügen Sie in , Code ähnlich wie der folgende hervorgehobene Code hinzu:
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();
Im vorherigen Beispiel ist eine vom Benutzer bereitgestellte Bibliothek, die erkennt, MyUserAgentDetectionLib.DisallowsSameSiteNone
ob der Benutzer-Agent sameSite None
nicht unterstützt:
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
Der folgende Code zeigt eine Beispielmethode DisallowsSameSiteNone
:
Warnung
Der folgende Code dient nur zur Demonstration:
- Es sollte nicht als vollständig betrachtet werden.
- Es wird nicht verwaltet oder unterstützt.
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;
}
Testen von Apps für SameSite-Probleme
Apps, die mit Remotewebsites interagieren, z. B. über die Anmeldung von Drittanbietern, müssen:
- Testen Sie die Interaktion auf mehreren Browsern.
- Wenden Sie die CookieRichtlinienbrowsererkennung und -entschärfung in diesem Dokument an.
Testen Sie Web-Apps mithilfe einer Clientversion, die sich für das neue SameSite-Verhalten anmelden kann. Chrome, Firefox und Chromium Edge verfügen über neue Opt-In-Feature-Flags, die zum Testen verwendet werden können. Nachdem Ihre App die SameSite-Patches angewendet hat, testen Sie sie mit älteren Clientversionen, insbesondere Safari. Weitere Informationen finden Sie unter Unterstützen älterer Browser in diesem Dokument.
Testen mit Chrome
Chrome 78+ gibt irreführende Ergebnisse, da es eine temporäre Entschärfung hat. Die temporäre Minderung von Chrome 78+ ermöglicht cookieweniger als zwei Minuten alt. Chrome 76 oder 77 mit aktivierten Testzeichen bietet genauere Ergebnisse. Um das neue SameSite-Verhalten chrome://flags/#same-site-by-default-cookies
zu aktivieren. Ältere Versionen von Chrome (75 und unten) werden mit der neuen None
Einstellung fehlschlagen. Siehe Unterstützung älterer Browser in diesem Dokument.
Google stellt ältere Chromversionen nicht zur Verfügung. Folgen Sie den Anweisungen zum Herunterladen Chromium, um ältere Versionen von Chrome zu testen. Laden Sie Chrome nicht aus Links herunter, indem Sie nach älteren Versionen von Chrome suchen.
Ab der Kanarischen Version 80.0.3975.0
kann die temporäre Entschärfung lax+POST für Testzwecke mit dem neuen Flag --enable-features=SameSiteDefaultChecksMethodRigorously
deaktiviert werden, um Tests von Websites und Diensten im späteren Endzustand des Features zu ermöglichen, in dem die Entschärfung entfernt wurde. Weitere Informationen finden Sie unter "The Chromium Projects SameSite Aktualisierungen
Testen mit Safari
Safari 12 implementierte den vorherigen Entwurf streng und schlägt fehl, wenn der neue None
Wert in einem cookie. None
wird über den Browsererkennungscode vermieden, der ältere Browser in diesem Dokument unterstützt. Testen Sie Safari 12, Safari 13 und WebKit-basierte Betriebssystem-Formatanmeldungen mithilfe von MSAL, ADAL oder einer beliebigen Bibliothek, die Sie verwenden. Das Problem hängt von der zugrunde liegenden Betriebssystemversion ab. OSX Mojave (10.14) und iOS 12 sind bekannt, dass Kompatibilitätsprobleme mit dem neuen SameSite-Verhalten auftreten. Das Upgrade des Betriebssystems auf OSX Catalina (10.15) oder iOS 13 korrigiert das Problem. Safari verfügt derzeit nicht über ein Opt-In-Flag zum Testen des neuen Spezifikationsverhaltens.
Testen mit Firefox
Firefox-Unterstützung für den neuen Standard kann auf Version 68+ getestet werden, indem Sie sich auf der Seite mit dem about:config
Feature-Flag network.cookie.sameSite.laxByDefault
anmelden. Es gab keine Berichte über Kompatibilitätsprobleme mit älteren Versionen von Firefox.
Testen mit Edge-Browser
Edge unterstützt den alten SameSite-Standard. Edge Version 44 hat keine bekannten Kompatibilitätsprobleme mit dem neuen Standard.
Testen mit Edge (Chromium)
SameSite-Flags werden auf der edge://flags/#same-site-by-default-cookies
Seite festgelegt. Es wurden keine Kompatibilitätsprobleme mit Edge Chromium erkannt.
Testen mit Electron
Versionen von älteren Versionen von Electron Chromium enthalten. Beispielsweise ist die von Teams verwendete Version Electron Chromium 66, die das ältere Verhalten anzeigt. Sie müssen ihre eigenen Kompatibilitätstests mit der Version Ihres Electron Produkts ausführen. Siehe Unterstützung älterer Browser im folgenden Abschnitt.
Zusätzliche Ressourcen
- Chromium Blog:Entwickler: Bereit für neue SameSite=None; Sichere Cookie Einstellungen
- SameSites cookieerläutert
- November 2019 Patches
Beispiel | Dokument |
---|---|
.NET Core-Seiten Razor | ASP.NET Core 3.1 Razor Pages SameSite-Beispiel cookie |
Das folgende Beispiel kann heruntergeladen und getestet werden:
Beispiel | Dokument |
---|---|
.NET Core-Seiten Razor | ASP.NET Core 3.1 Razor Pages SameSite-Beispiel cookie |
.NET Core-Unterstützung für das gleicheSite-Attribut
.NET Core 3.1 und höher unterstützen den Entwurfsstandard 2019 für SameSite. Entwickler können den Wert desselbenSite-Attributs mit der HttpCookie.SameSite
Eigenschaft programmgesteuert steuern. Wenn Sie die SameSite
Eigenschaft auf "Strict", "Lax" oder "None" festlegen, werden diese Werte im Netzwerk mit dem cookieWert geschrieben. Festlegen, (SameSiteMode)(-1)
dass kein gleichesSite-Attribut im Netzwerk mit dem Netzwerk enthalten sein soll 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 und höher unterstützen die aktualisierten SameSite-Werte und fügt einen zusätzlichen Aufzählungswert hinzu. SameSiteMode.Unspecified
SameSiteMode
Dieser neue Wert gibt an, dass keine gleiche Website mit dem cookieWert gesendet werden soll.
API-Verwendung mit SameSite
HttpContext.Response.Cookie s.Append standardmäßig an Unspecified
, d. h. kein SameSite-Attribut, das dem cookie Client hinzugefügt wurde, und der Client verwendet sein Standardverhalten (Lax für neue Browser, Keine für alte). Im folgenden Code wird gezeigt, wie Sie den cookie SameSite-Wert in SameSiteMode.Lax
:
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
Alle ASP.NET Core Komponenten, die die vorhergehenden Standardeinstellungen außer cookieKraft setzen, die für ihre Szenarien geeignet sind. Die vorhergehenden Standardwerte wurden nicht geändert.
ASP.NET Core 3.1 und höher bietet den folgenden SameSite-Support:
- Definiert das Verhalten des
SameSiteMode.None
Emittierens neu.SameSite=None
- Fügt einen neuen Wert
SameSiteMode.Unspecified
hinzu, um das SameSite-Attribut auszulassen. - Alle cookieAPIs standardmäßig auf
Unspecified
. Einige Komponenten, die bestimmte Werte für ihre Szenarien verwenden cookie. In der obigen Tabelle finden Sie Beispiele.
In ASP.NET Core 3.0 und höher wurden die SameSite-Standardeinstellungen geändert, um Konflikte mit inkonsistenten Clientstandarden zu vermeiden. Die folgenden APIs haben die Standardeinstellung SameSiteMode.Lax
geändert, -1
um ein SameSite-Attribut für diese cookies zu vermeiden:
- CookieOptions wird mit HttpContext.Response verwendet.Cookie s.Append
- CookieBuilder verwendet als Fabrik für
CookieOptions
- CookiePolicyOptions.MinimumSameSitePolicy
Verlauf und Änderungen
Die SameSite-Unterstützung wurde zuerst in ASP.NET Core in 2.0 mit dem 2016-Entwurfsstandard implementiert. Der Standard 2016 war opt-in. ASP.NET Core aktiviert, indem sie standardmäßig mehrere cookies Lax
festlegen. Nachdem mehrere Probleme mit der Authentifizierung auftreten, wurde die meisten Verwendung von SameSite deaktiviert.
Patches wurden im November 2019 ausgestellt, um vom Standard 2016 auf den Standard 2019 zu aktualisieren. Der Entwurf der SameSite-Spezifikation 2019:
- Ist nicht rückwärts kompatibel mit dem Entwurf von 2016. Weitere Informationen finden Sie unter Unterstützen älterer Browser in diesem Dokument.
- Gibt cookiean, dass s standardmäßig behandelt
SameSite=Lax
werden. - Gibt s an cookie, die explizit geltend
SameSite=None
gemacht werden, um die Websitebereitstellung zu aktivieren, alsSecure
gekennzeichnet werden soll.None
ist ein neuer Eintrag zum Abmelden. - Wird von Patches unterstützt, die für ASP.NET Core 2.1, 2.2 und 3.0 ausgestellt wurden. ASP.NET Core 3.1 verfügt über zusätzlichen SameSite-Support.
- Wird standardmäßig in Chrome im Februar 2020 aktiviert. Browser begannen 2019 in diesen Standard zu wechseln.
APIs, die von der Änderung des Standardentwurfs von 2016 SameSite in den Standard für 2019 betroffen sind
- Http.SameSiteMode
- CookieOptions.SameSite
- CookieBuilder.SameSite
- CookiePolicyOptions.MinimumSameSitePolicy
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
Unterstützen älterer Browser
Der 2016 SameSite-Standard hat vorgeschrieben, dass unbekannte Werte als SameSite=Strict
Werte behandelt werden müssen. Apps, auf die von älteren Browsern zugegriffen wird, die den Standard 2016 SameSite unterstützen, können unterbrochen werden, wenn sie eine SameSite-Eigenschaft mit einem Wert None
erhalten. Web-Apps müssen die Browsererkennung implementieren, wenn sie ältere Browser unterstützen möchten. ASP.NET Core implementiert keine Browsererkennung, da User-Agents Werte stark veränderlich sind und häufig geändert werden. Ein Erweiterungspunkt in Microsoft.AspNetCore.CookiePolicy ermöglicht das Anschließen User-Agent spezifischen Logik.
Startup.Configure
Fügen Sie Code hinzu, der aufgerufen UseCookiePolicy wird, bevor Sie aufrufen oder eine beliebige Methode schreibenUseAuthentication, die Folgendes cookieschreibt:
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();
});
}
Fügen Sie in Startup.ConfigureServices
, code ähnlich wie folgt hinzu:
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;
}
}
}
Im vorherigen Beispiel wird eine vom Benutzer bereitgestellte Bibliothek bereitgestellt, die erkennt, MyUserAgentDetectionLib.DisallowsSameSiteNone
ob der Benutzer-Agent SameSite None
nicht unterstützt:
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
Der folgende Code zeigt eine Beispielmethode DisallowsSameSiteNone
:
Warnung
Der folgende Code dient nur zur Demonstration:
- Es sollte nicht als vollständig betrachtet werden.
- Es wird nicht verwaltet oder unterstützt.
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;
}
Testen von Apps für SameSite-Probleme
Apps, die mit Remotewebsites interagieren, z. B. über die Anmeldung von Drittanbietern, müssen Folgendes ausführen:
- Testen Sie die Interaktion auf mehreren Browsern.
- Wenden Sie die richtlinienbrowsererkennung und -entschärfung an, dieCookie in diesem Dokument erläutert wird.
Testen Sie Web-Apps mithilfe einer Clientversion, die sich für das neue SameSite-Verhalten anmelden kann. Chrome, Firefox und Chromium Edge verfügen alle über neue Opt-In-Feature-Flags, die zum Testen verwendet werden können. Nachdem Ihre App die SameSite-Patches angewendet hat, testen Sie sie mit älteren Clientversionen, insbesondere Safari. Weitere Informationen finden Sie unter Unterstützen älterer Browser in diesem Dokument.
Testen mit Chrome
Chrome 78+ gibt irreführende Ergebnisse, da sie eine vorübergehende Entschärfung aufweist. Die temporäre Entschärfung von Chrome 78+ ermöglicht cookieweniger als zwei Minuten alt. Chrome 76 oder 77 mit aktivierten Testkennzeichnungen bietet genauere Ergebnisse. So testen Sie das neue SameSite-Verhalten chrome://flags/#same-site-by-default-cookies
auf "Aktiviert". Ältere Versionen von Chrome (75 und unten) werden gemeldet, wenn die neue None
Einstellung fehlschlägt. Weitere Informationen finden Sie unter Unterstützen älterer Browser in diesem Dokument.
Google stellt keine älteren Chrome-Versionen zur Verfügung. Befolgen Sie die Anweisungen unter Download Chromium, um ältere Versionen von Chrome zu testen. Laden Sie Chrome nicht aus Links herunter, indem Sie nach älteren Versionen von Chrome suchen.
Ab der Kanarischen Version 80.0.3975.0
kann die temporäre Entschärfung von Lax+POST für Testzwecke mithilfe des neuen Kennzeichens --enable-features=SameSiteDefaultChecksMethodRigorously
deaktiviert werden, um Tests von Websites und Diensten im enden Zustand des Features zu ermöglichen, in dem die Entschärfung entfernt wurde. Weitere Informationen finden Sie unter "The Chromium Projects SameSite Aktualisierungen
Testen mit Safari
Safari 12 implementierte den vorherigen Entwurf streng und schlägt fehl, wenn der neue None
Wert in einem .cookie None
wird über den Browsererkennungscode vermieden, der ältere Browser in diesem Dokument unterstützt. Testen Sie Safari 12, Safari 13 und WebKit-basierte Betriebssystemstilanmeldungen mithilfe von MSAL, ADAL oder einer beliebigen Bibliothek, die Sie verwenden. Das Problem hängt von der zugrunde liegenden Betriebssystemversion ab. OSX Mojave (10.14) und iOS 12 sind bekannt, dass Kompatibilitätsprobleme mit dem neuen SameSite-Verhalten auftreten. Das Upgrade des Betriebssystems auf OSX Catalina (10.15) oder iOS 13 behebt das Problem. Safari verfügt derzeit nicht über ein Opt-In-Flag zum Testen des neuen Spezifikationsverhaltens.
Testen mit Firefox
Firefox-Unterstützung für den neuen Standard kann auf Version 68+ getestet werden, indem Sie sich auf der Seite mit dem about:config
Feature-Flag network.cookie.sameSite.laxByDefault
anmelden. Es gab keine Berichte über Kompatibilitätsprobleme mit älteren Versionen von Firefox.
Testen mit Edgebrowser
Edge unterstützt den alten SameSite-Standard. Edge Version 44 hat keine bekannten Kompatibilitätsprobleme mit dem neuen Standard.
Testen mit Edge (Chromium)
SameSite-Flags werden auf der edge://flags/#same-site-by-default-cookies
Seite festgelegt. Es wurden keine Kompatibilitätsprobleme mit Edge Chromium gefunden.
Testen mit Electron
Versionen von Electron Chromium enthalten ältere Versionen. Die von Teams verwendete Version Electron ist beispielsweise Chromium 66, die das ältere Verhalten anzeigt. Sie müssen ihre eigenen Kompatibilitätstests mit der Version Electron Ihres Produkts durchführen. Weitere Informationen finden Sie unter Unterstützen älterer Browser im folgenden Abschnitt.
Zusätzliche Ressourcen
- Chromium Blog:Entwickler: Vorbereiten für neue SameSite=None; Sichere Cookie Einstellungen
- SameSites cookieerläutert
- November 2019 Patches
Beispiel | Dokument |
---|---|
.NET Core Razor Pages | ASP.NET Core 3.1 Razor Seiten SameSite-Beispiel cookie |
Die folgenden Beispiele können heruntergeladen und getestet werden:
Beispiel | Dokument |
---|---|
.NET Core MVC | beispiel für ASP.NET Core 2.1 MVC SameSite cookie |
.NET Core Razor Pages | ASP.NET Core 2.1 Razor Seiten SameSite-Beispiel cookie |
Änderungen am Patchverhalten im Dezember
Die spezifische Verhaltensänderung für .NET Framework und .NET Core 2.1 ist, wie die SameSite
Eigenschaft den None
Wert interpretiert. Bevor der Patch einen Wert mit None
der Bezeichnung "Das Attribut nicht überhaupt ausgeben" bedeutet, bedeutet er nach dem Patch "Emit the attribute with a value of None
". Nach dem Patch wird der SameSite
Wert der (SameSiteMode)(-1)
Ursache verursacht, dass das Attribut nicht ausgegeben wird.
Der Standardwert "SameSite" für die Formularauthentifizierung und den Sitzungsstatus cookiewurde von "in None
" Lax
geändert.
API-Verwendung mit SameSite
HttpContext.Response.Cookie s.Append defaults to Unspecified
, also no SameSite attribut added to the cookie and the client will use its default behavior (Lax for new browsers, None for old ones). Der folgende Code zeigt, wie Sie den cookie SameSite-Wert in SameSiteMode.Lax
:
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
Alle ASP.NET Core Komponenten, die die vorherigen Standardeinstellungen außer Kraft setzencookie, die für ihre Szenarien geeignet sind. Die vorangehenden Standardwerte wurden nicht geändert.
Verlauf und Änderungen
Die SameSite-Unterstützung wurde zuerst in ASP.NET Core in 2.0 mit dem 2016-Entwurfsstandard implementiert. Der Standard 2016 war opt-in. ASP.NET Core aktiviert, indem sie standardmäßig mehrere cookies Lax
festlegen. Nachdem mehrere Probleme mit der Authentifizierung auftreten, wurde die meisten SameSite-Verwendung deaktiviert.
Patches wurden im November 2019 veröffentlicht, um vom Standard 2016 auf den Standard 2019 zu aktualisieren. Der Entwurf der SameSite-Spezifikation 2019:
- Ist nicht abwärtskompatibel mit dem Entwurf von 2016. Weitere Informationen finden Sie unter Unterstützen älterer Browser in diesem Dokument.
- Gibt cookiean, dass s standardmäßig behandelt
SameSite=Lax
wird. - Gibt s an cookie, die explizit geltend gemacht
SameSite=None
werden, um die standortübergreifende Übermittlung zu ermöglichen, alsSecure
gekennzeichnet werden soll.None
ist ein neuer Eintrag zum Abmelden. - Wird von Patches unterstützt, die für ASP.NET Core 2.1, 2.2 und 3.0 ausgestellt wurden. ASP.NET Core 3.1 verfügt über zusätzliche SameSite-Unterstützung.
- Wird standardmäßig in Chrome im Februar 2020 aktiviert. Browser begannen 2019 in diesen Standard zu wechseln.
APIs, die von der Änderung des Standardentwurfs von 2016 SameSite in den Standard für 2019 betroffen sind
- Http.SameSiteMode
- CookieOptions.SameSite
- CookieBuilder.SameSite
- CookiePolicyOptions.MinimumSameSitePolicy
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
Unterstützen älterer Browser
Der 2016 SameSite-Standard hat vorgeschrieben, dass unbekannte Werte als SameSite=Strict
Werte behandelt werden müssen. Apps, auf die von älteren Browsern zugegriffen wird, die den Standard 2016 SameSite unterstützen, können unterbrochen werden, wenn sie eine SameSite-Eigenschaft mit einem Wert None
erhalten. Web-Apps müssen die Browsererkennung implementieren, wenn sie ältere Browser unterstützen möchten. ASP.NET Core implementiert keine Browsererkennung, da User-Agents Werte stark veränderlich sind und häufig geändert werden. Ein Erweiterungspunkt in Microsoft.AspNetCore.CookiePolicy ermöglicht das Anschließen User-Agent spezifischen Logik.
Startup.Configure
Fügen Sie Code hinzu, der aufgerufen UseCookiePolicy wird, bevor Sie aufrufen oder eine beliebige Methode schreibenUseAuthentication, die Folgendes cookieschreibt:
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();
});
}
Fügen Sie in Startup.ConfigureServices
, code ähnlich wie folgt hinzu:
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);
}
}
}
Im vorherigen Beispiel wird eine vom Benutzer bereitgestellte Bibliothek bereitgestellt, die erkennt, MyUserAgentDetectionLib.DisallowsSameSiteNone
ob der Benutzer-Agent SameSite None
nicht unterstützt:
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
Der folgende Code zeigt eine Beispielmethode DisallowsSameSiteNone
:
Warnung
Der folgende Code dient nur zur Demonstration:
- Es sollte nicht als vollständig betrachtet werden.
- Es wird nicht verwaltet oder unterstützt.
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;
}
Testen von Apps für SameSite-Probleme
Apps, die mit Remotewebsites interagieren, z. B. über die Anmeldung von Drittanbietern, müssen Folgendes ausführen:
- Testen Sie die Interaktion auf mehreren Browsern.
- Wenden Sie die richtlinienbrowsererkennung und -entschärfung an, dieCookie in diesem Dokument erläutert wird.
Testen Sie Web-Apps mithilfe einer Clientversion, die sich für das neue SameSite-Verhalten anmelden kann. Chrome, Firefox und Chromium Edge verfügen alle über neue Opt-In-Feature-Flags, die zum Testen verwendet werden können. Nachdem Ihre App die SameSite-Patches angewendet hat, testen Sie sie mit älteren Clientversionen, insbesondere Safari. Weitere Informationen finden Sie unter Unterstützen älterer Browser in diesem Dokument.
Testen mit Chrome
Chrome 78+ gibt irreführende Ergebnisse, da sie eine vorübergehende Entschärfung aufweist. Die temporäre Entschärfung von Chrome 78+ ermöglicht cookieweniger als zwei Minuten alt. Chrome 76 oder 77 mit aktivierten Testkennzeichnungen bietet genauere Ergebnisse. So testen Sie das neue SameSite-Verhalten chrome://flags/#same-site-by-default-cookies
auf "Aktiviert". Ältere Versionen von Chrome (75 und unten) werden gemeldet, wenn die neue None
Einstellung fehlschlägt. Weitere Informationen finden Sie unter Unterstützen älterer Browser in diesem Dokument.
Google stellt keine älteren Chrome-Versionen zur Verfügung. Befolgen Sie die Anweisungen unter Download Chromium, um ältere Versionen von Chrome zu testen. Laden Sie Chrome nicht aus Links herunter, indem Sie nach älteren Versionen von Chrome suchen.
Ab der Kanarischen Version 80.0.3975.0
kann die temporäre Entschärfung von Lax+POST für Testzwecke mithilfe des neuen Kennzeichens --enable-features=SameSiteDefaultChecksMethodRigorously
deaktiviert werden, um Tests von Websites und Diensten im enden Zustand des Features zu ermöglichen, in dem die Entschärfung entfernt wurde. Weitere Informationen finden Sie unter "The Chromium Projects SameSite Aktualisierungen
Testen mit Safari
Safari 12 implementierte den vorherigen Entwurf streng und schlägt fehl, wenn der neue None
Wert in einem .cookie None
wird über den Browsererkennungscode vermieden, der ältere Browser in diesem Dokument unterstützt. Testen Sie Safari 12, Safari 13 und WebKit-basierte Betriebssystemstilanmeldungen mithilfe von MSAL, ADAL oder einer beliebigen Bibliothek, die Sie verwenden. Das Problem hängt von der zugrunde liegenden Betriebssystemversion ab. OSX Mojave (10.14) und iOS 12 sind bekannt, dass Kompatibilitätsprobleme mit dem neuen SameSite-Verhalten auftreten. Das Upgrade des Betriebssystems auf OSX Catalina (10.15) oder iOS 13 behebt das Problem. Safari verfügt derzeit nicht über ein Opt-In-Flag zum Testen des neuen Spezifikationsverhaltens.
Testen mit Firefox
Firefox-Unterstützung für den neuen Standard kann auf Version 68+ getestet werden, indem Sie sich auf der Seite mit dem about:config
Feature-Flag network.cookie.sameSite.laxByDefault
anmelden. Es gab keine Berichte über Kompatibilitätsprobleme mit älteren Versionen von Firefox.
Testen mit Edgebrowser
Edge unterstützt den alten SameSite-Standard. Edge Version 44 hat keine bekannten Kompatibilitätsprobleme mit dem neuen Standard.
Testen mit Edge (Chromium)
SameSite-Flags werden auf der edge://flags/#same-site-by-default-cookies
Seite festgelegt. Es wurden keine Kompatibilitätsprobleme mit Edge Chromium gefunden.
Testen mit Electron
Versionen von Electron Chromium enthalten ältere Versionen. Die von Teams verwendete Version Electron ist beispielsweise Chromium 66, die das ältere Verhalten anzeigt. Sie müssen ihre eigenen Kompatibilitätstests mit der Version Electron Ihres Produkts durchführen. Weitere Informationen finden Sie unter Unterstützen älterer Browser im folgenden Abschnitt.
Zusätzliche Ressourcen
- Chromium Blog:Entwickler: Vorbereiten für neue SameSite=None; Sichere Cookie Einstellungen
- SameSites cookieerläutert
- November 2019 Patches
Beispiel | Dokument |
---|---|
.NET Core MVC | beispiel für ASP.NET Core 2.1 MVC SameSite cookie |
.NET Core Razor Pages | ASP.NET Core 2.1 Razor Seiten SameSite-Beispiel cookie |