Ereignisse
Nehmen Sie uns bei FabCon Vegas bei
31. März, 23 Uhr - 2. Apr., 23 Uhr
Das ultimative Microsoft Fabric-, Power BI-, SQL- und AI-communitygeführte Ereignis. 31. März bis 2. April 2025.
Jetzt registrierenDieser Browser wird nicht mehr unterstützt.
Führen Sie ein Upgrade auf Microsoft Edge durch, um die neuesten Features, Sicherheitsupdates und den technischen Support zu nutzen.
Von Rick Anderson
SameSite
ist ein IETF-Entwurf , der einen gewissen Schutz vor Websiteanforderungsfälschungen (CSRF)-Angriffen bietet. Der SameSite 2019-Entwurf:
SameSite=Lax
standardmäßig.SameSite=None
, um die standortübergreifende Zustellung zu ermöglichen, als Secure
gekennzeichnet werden.Lax
funktioniert für die meisten App-Cookies. Einige Formen der Authentifizierung wie OpenID Connect (OIDC) und Webdiensteverbund verwenden standardmäßig POST-basierte Umleitungen. Die POST-basierten Umleitungen lösen den SameSite
Browserschutz aus, ist daher SameSite
für diese Komponenten deaktiviert. Die meisten OAuth-Anmeldungen sind aufgrund von Unterschieden beim Ablauf der Anforderung nicht betroffen. Alle anderen Komponenten werden nicht standardmäßig festgelegt SameSite
und verwenden das Standardverhalten von Clients (alt oder neu).
Der None
Parameter verursacht Kompatibilitätsprobleme mit Clients, die den Standardentwurf vor 2016 implementiert haben (z. B. iOS 12). Weitere Informationen finden Sie unter Unterstützung älterer Browser in diesem Dokument.
Jede OWIN-Komponente, die Cookies ausgibt, muss entscheiden, ob SameSite
dies angemessen ist.
Informationen zur ASP.NET 4.x-Version dieses Artikels finden Sie unter "Arbeiten mit SameSite-Cookies" in ASP.NET.
Microsoft.Owin
hat eine eigene SameSite
Implementierung:
System.Web
in .SameSite
funktioniert für alle Versionen, die von den Microsoft.Owin
Paketen ,.NET 4.5 und höher zielfähig sind.System.Web
HttpCookie
Klasse.SystemWebCookieManager
hängt von den .NET 4.7.2-APIs System.Web
ab, um die Unterstützung zu aktivieren SameSite
, und von den Patches zum Ändern des Verhaltens.
Die Gründe für die Verwendung SystemWebCookieManager
sind in OWIN- und System.Web Response-Cookie-Integrationsproblemen beschrieben. SystemWebCookieManager
wird empfohlen, wenn sie ausgeführt wird.System.Web
Der folgende Code wird auf SameSite
:Lax
owinContext.Response.Cookies.Append("My Key", "My Value", new CookieOptions()
{
SameSite = SameSiteMode.Lax
});
Die folgenden APIs verwenden SameSite
:
Microsoft.Owin hat den SameSite
2016-Entwurfsstandard nie unterstützt.
Unterstützung für den SameSite 2019-Entwurf ist nur in Microsoft.Owin
4.1.0 und höher verfügbar. Es gibt keine Patches für frühere Versionen.
Der Entwurf der SameSite
Spezifikation 2019:
SameSite=Lax
behandelt werden.SameSite=None
bestätigen, um eine Site-übergreifende Zustellung zu ermöglichen, als Secure
markiert werden sollen. None
ist ein neuer Eintrag zum Kündigen des Abonnements.Der Standard 2016 SameSite
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 dem Wert " None
. Web-Apps müssen eine Browsererkennung implementieren, wenn sie ältere Browser unterstützen wollen. ASP.NET implementiert keine Browsererkennung, da Benutzer-Agents-Werte stark veränderlich sind und sich häufig ändern. Ein Erweiterungspunkt in ICookieManager ermöglicht das Anschließen von Benutzer-Agent-spezifischer Logik.
Fügen Sie in Startup.Configuration
einen Code ähnlich dem folgenden hinzu:
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.
Der vorangehende Code erfordert den Patch .NET 4.7.2 oder höher SameSite
.
Der folgende Code zeigt eine Beispielimplementierung von 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;
}
}
Im vorherigen Beispiel DisallowsSameSiteNone
wird in der CheckSameSite
Methode aufgerufen. DisallowsSameSiteNone
ist eine Benutzermethode, die erkennt, ob der Benutzer-Agent nicht unterstützt SameSite
None
:
private void CheckSameSite(IOwinContext context, CookieOptions options)
{
if (options.SameSite == Microsoft.Owin.SameSiteMode.None
&& DisallowsSameSiteNone(context))
{
options.SameSite = null;
}
}
Der folgende Code zeigt ein Beispiel für eine DisallowsSameSiteNone
-Methode:
Warnung
Der folgende Code dient nur zur Demonstration:
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;
}
Apps, die mit Remotestandorten interagieren, z. B. über die Anmeldung über Drittanbieter, müssen folgende Aktionen ausführen:
Testen Sie Web-Apps mit einer Clientversion, die sich für das neue SameSite
Verhalten anmelden kann. Chrome, Firefox und Chromium Edge verfügen über neue Featureflags, die für Tests 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ützung älterer Browser in diesem Dokument.
Chrome 78+ liefert irreführende Ergebnisse, da es eine vorübergehende Risikominderung aufweist. Die temporäre Risikominderung von Chrome 78+ gestattet Cookies, die weniger als zwei Minuten alt sind. Chrome 76 oder 77 mit den entsprechenden aktivierten Testflags liefert genauere Ergebnisse. So testen Sie die Umschaltfläche "Neues SameSite
Verhalten" auf "Aktiviert".chrome://flags/#same-site-by-default-cookies
Bei älteren Versionen von Chrome (75 und niedriger) wird gemeldet, dass mit der neuen None
-Einstellung ein Fehler auftritt. Weitere Informationen finden Sie unter Unterstützung älterer Browser in diesem Dokument.
Google stellt keine älteren Chrome-Versionen zur Verfügung. Befolgen Sie die Anweisungen unter Herunterladen von Chromium, um ältere Versionen von Chrome zu testen. Laden Sie Chrome nicht über Links herunter, die bei der Suche nach älteren Versionen von Chrome bereitgestellt werden.
Safari 12 hat den vorherigen Entwurf strikt implementiert und schlägt fehl, wenn der neue None
Wert in einem Cookie enthalten ist. None
wird über den Browsererkennungscode vermieden: Unterstützung älterer Browser in diesem Dokument. Testen Sie Safari 12, Safari 13 und WebKit-basierte Anmeldungen im Betriebssystemstil mithilfe von MSAL 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 Problem lässt sich mit einem Upgrade des Betriebssystems auf OSX Catalina (10.15) bzw. iOS 13 beheben. Safari verfügt derzeit nicht über ein Aktivierungsflag zum Testen des neuen Spezifikationsverhaltens.
Die Firefox-Unterstützung für den neuen Standard kann in Version 68+ getestet werden, indem Sie sich auf der Seite about:config
mit dem Featureflag network.cookie.sameSite.laxByDefault
anmelden. Es liegen keine Berichte über Kompatibilitätsprobleme mit älteren Versionen von Firefox vor.
Edge unterstützt den alten SameSite
Standard. Die Edge-Version 44 weist keine bekannten Kompatibilitätsprobleme mit dem neuen Standard auf.
SameSite
Flags werden auf der edge://flags/#same-site-by-default-cookies
Seite festgelegt. Es wurden keine Kompatibilitätsprobleme mit Edge Chromium festgestellt.
Zu den Electron-Versionen zählen ältere Versionen von Chromium. Beispielsweise ist die von Teams verwendete Version von Electron Chromium 66, die das ältere Verhalten zeigt. Sie müssen Ihre eigenen Kompatibilitätstests mit der Version von Electron durchführen, die Ihr Produkt verwendet. Weitere Informationen finden Sie unter Unterstützung älterer Browser im folgenden Abschnitt.
Ereignisse
Nehmen Sie uns bei FabCon Vegas bei
31. März, 23 Uhr - 2. Apr., 23 Uhr
Das ultimative Microsoft Fabric-, Power BI-, SQL- und AI-communitygeführte Ereignis. 31. März bis 2. April 2025.
Jetzt registrieren