Auf Englisch lesen

Freigeben über


SameSite-Cookies und die Open Web Interface für .NET (OWIN)

Von Rick Anderson

SameSite ist ein IETF-Entwurf , der einen gewissen Schutz vor Websiteanforderungsfälschungen (CSRF)-Angriffen bietet. Der SameSite 2019-Entwurf:

  • Behandelt Cookies SameSite=Lax standardmäßig.
  • Gibt Cookies an, die ausdrücklich bestätigen SameSite=None , um die standortübergreifende Zustellung zu ermöglichen, als Securegekennzeichnet 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.

API-Verwendung mit SameSite

Microsoft.Owin hat eine eigene SameSite Implementierung:

  • Das hängt nicht direkt von dem System.Webin .
  • SameSite funktioniert für alle Versionen, die von den Microsoft.Owin Paketen ,.NET 4.5 und höher zielfähig sind.
  • Nur die SystemWebCookieManager-Komponente interagiert direkt mit der 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. SystemWebCookieManagerwird 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:

Verlauf und Änderungen

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:

  • Er ist nicht abwärtskompatibel mit dem Entwurf von 2016. Weitere Informationen finden Sie unter Unterstützung älterer Browser in diesem Dokument.
  • Gibt an, dass Cookies standardmäßig als SameSite=Lax behandelt werden.
  • Gibt an, dass Cookies, die explizit 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.
  • Wurde von Chrome standardmäßig im Februar 2020 aktiviert. Die Browser werden seit 2019 auf diesen Standard umgestellt.
  • Wird von Patches unterstützt, die wie in KB-Artikeln beschrieben ausgegeben werden. Weitere Informationen finden Sie in KB-Artikeln, die SameSite in .NET Framework unterstützen.

Unterstützung älterer Browser

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:

  • Er sollte nicht als vollständig betrachtet werden.
  • Er wird nicht verwaltet oder unterstützt.
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;
}

Testen von Apps für SameSite-Probleme

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.

Testen mit Chrome

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.

Testen mit Safari

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.

Testen mit Firefox

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.

Testen mit dem Edge-Browser

Edge unterstützt den alten SameSite Standard. Die Edge-Version 44 weist keine bekannten Kompatibilitätsprobleme mit dem neuen Standard auf.

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 festgestellt.

Testen mit Elektronen

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.

Zusätzliche Ressourcen