Sdílet prostřednictvím


Soubory cookie SameSite a Open Web Interface pro .NET (OWIN)

Autor: Rick Anderson

SameSiteje koncept IETF navržený tak, aby poskytoval určitou ochranu před útoky csrF (cross-site request forgery). Koncept SameSite 2019:

  • Považuje soubory cookie za SameSite=Lax výchozí.
  • Uvádí soubory cookie, které výslovně uplatňují SameSite=None , aby bylo možné povolit doručování mezi weby, by měly být označeny jako Secure.

Lax funguje pro většinu souborů cookie aplikace. Některé formy ověřování, jako je OpenID Connect (OIDC) a WS-Federation , jsou ve výchozím nastavení přesměrování založené na POST. Přesměrování založená na POST aktivují SameSite ochranu prohlížeče, takže SameSite je pro tyto komponenty zakázaná. Většina přihlášení OAuth nemá vliv na rozdíly ve způsobu toku požadavků. Všechny ostatní komponenty ve výchozím nastavení nenastavují SameSite a používají výchozí chování klientů (staré nebo nové).

Parametr None způsobuje problémy s kompatibilitou s klienty, kteří implementovali předchozí standard konceptu 2016 (například iOS 12). Viz Podpora starších prohlížečů v tomto dokumentu.

Každá komponenta OWIN, která generuje soubory cookie, se musí rozhodnout, jestli SameSite je to vhodné.

Informace o verzi ASP.NET 4.x tohoto článku najdete v tématu Práce se soubory cookie SameSite v ASP.NET.

Využití rozhraní API se samesitem

Microsoft.Owin má vlastní SameSite implementaci:

SystemWebCookieManager závisí na rozhraníCH API .NET 4.7.2 System.Web , která umožňují SameSite podporu, a opravách, které změní chování.

Důvody použití SystemWebCookieManager jsou popsané v problémech s integrací souborů cookie odpovědi OWIN a System.Web. SystemWebCookieManagerse doporučuje při spuštění .System.Web

Následující kód nastavíSameSite:Lax

owinContext.Response.Cookies.Append("My Key", "My Value", new CookieOptions()
{
    SameSite = SameSiteMode.Lax
});

Následující rozhraní API používají SameSite:

Historie a změny

Microsoft.Owin nikdy nepodporuje SameSite koncept standardu 2016.

Podpora konceptu SameSite 2019 je dostupná pouze ve Microsoft.Owin verzi 4.1.0 a novější. Pro předchozí verze nejsou k dispozici žádné opravy.

Návrh specifikace z roku 2019 SameSite :

  • Není zpětně kompatibilní s konceptem 2016. Další informace naleznete v tématu Podpora starších prohlížečů v tomto dokumentu.
  • Určuje soubory cookie, které jsou ve SameSite=Lax výchozím nastavení zpracovávány.
  • Určuje soubory cookie, které explicitně uplatňují SameSite=None , aby bylo možné povolit doručování mezi weby, by mělo být označeno jako Secure. None je nová položka pro odhlášení.
  • Ve výchozím nastavení je v únoru 2020 naplánované, aby ho chrome povolil. Prohlížeče začaly v roce 2019 přejít na tento standard.
  • Podporuje se opravami vydanými podle popisu v článcích znalostní báze. Další informace naleznete v článcích znalostní báze, které podporují SameSite v rozhraní .NET Framework.

Podpora starších prohlížečů

Standard 2016 SameSite nařídil, že neznámé hodnoty musí být považovány za SameSite=Strict hodnoty. Aplikace, ke kterým se přistupuje ze starších prohlížečů, které podporují standard 2016 SameSite , se můžou přerušit, když získají SameSite vlastnost s hodnotou None. Webové aplikace musí implementovat detekci prohlížeče, pokud mají v úmyslu podporovat starší prohlížeče. ASP.NET neimplementuje detekci prohlížeče, protože hodnoty User-Agents jsou vysoce nestálé a často se mění. Bod rozšíření v ICookieManager umožňuje připojit logiku specifickou pro uživatele agenta.

Do Startup.Configurationpole přidejte kód podobný následujícímu:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseOpenIdConnectAuthentication(
             new OpenIdConnectAuthenticationOptions
             {
                 // … Your preexisting options … 
                 CookieManager = new SameSiteCookieManager(
                                     new SystemWebCookieManager())
             });

        // Remaining code removed for brevity.

Předchozí kód vyžaduje opravu .NET 4.7.2 nebo novější SameSite .

Následující kód ukazuje ukázkovou implementaci SameSiteCookieManager:

public class SameSiteCookieManager : ICookieManager
{
    private readonly ICookieManager _innerManager;

    public SameSiteCookieManager() : this(new CookieManager())
    {
    }

    public SameSiteCookieManager(ICookieManager innerManager)
    {
        _innerManager = innerManager;
    }

    public void AppendResponseCookie(IOwinContext context, string key, string value,
                                     CookieOptions options)
    {
        CheckSameSite(context, options);
        _innerManager.AppendResponseCookie(context, key, value, options);
    }

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
    {
        CheckSameSite(context, options);
        _innerManager.DeleteCookie(context, key, options);
    }

    public string GetRequestCookie(IOwinContext context, string key)
    {
        return _innerManager.GetRequestCookie(context, key);
    }

    private void CheckSameSite(IOwinContext context, CookieOptions options)
    {
        if (options.SameSite == Microsoft.Owin.SameSiteMode.None 
                             && DisallowsSameSiteNone(context))
        {
            options.SameSite = null;
        }
    }

V předchozím vzorku se DisallowsSameSiteNone volá v CheckSameSite metodě. DisallowsSameSiteNone je uživatelská metoda, která zjistí, jestli uživatelský agent nepodporuje SameSite None:

private void CheckSameSite(IOwinContext context, CookieOptions options)
{
    if (options.SameSite == Microsoft.Owin.SameSiteMode.None 
                         && DisallowsSameSiteNone(context))
    {
        options.SameSite = null;
    }
}

Následující kód ukazuje ukázkovou DisallowsSameSiteNone metodu:

Upozorňující

Následující kód je určen pouze pro ukázku:

  • Nemělo by se považovat za dokončené.
  • Neudržuje se ani nepodporuje.
public static bool DisallowsSameSiteNone(IOwinContext context)
{
    var userAgent = context.Request.Headers["User-Agent"];
    
    if (string.IsNullOrEmpty(userAgent))
    {
        return false;
    }
    
    // Cover all iOS based browsers here. This includes:
    // - Safari on iOS 12 for iPhone, iPod Touch, iPad
    // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad
    // - Chrome on iOS 12 for iPhone, iPod Touch, iPad
    // All of which are broken by SameSite=None, because they use the iOS 
    // networking stack.
    if (userAgent.Contains("CPU iPhone OS 12") ||
        userAgent.Contains("iPad; CPU OS 12"))
    {
        return true;
    }

    // Cover Mac OS X based browsers that use the Mac OS networking stack. 
    // This includes:
    // - Safari on Mac OS X.
    // This does not include:
    // - Chrome on Mac OS X
    // Because they do not use the Mac OS networking stack.
    if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") &&
        userAgent.Contains("Version/") && userAgent.Contains("Safari"))
    {
        return true;
    }

    // Cover Chrome 50-69, because some versions are broken by SameSite=None, 
    // and none in this range require it.
    // Note: this covers some pre-Chromium Edge versions, 
    // but pre-Chromium Edge does not require SameSite=None.
    if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))
    {
        return true;
    }

    return false;
}

Testování aplikací pro problémy se samesitem

Aplikace, které komunikují se vzdálenými weby, jako je přihlášení třetích stran, musí:

  • Otestujte interakci v několika prohlížečích.
  • Použijte detekci a zmírnění rizik prohlížeče popsané v tomto dokumentu.

Otestujte webové aplikace pomocí klientské verze, která se může přihlásit k novému SameSite chování. Chrome, Firefox a Chromium Edge mají nové příznaky funkce opt-in, které je možné použít k testování. Jakmile aplikace použije SameSite opravy, otestujte ji ve starších verzích klienta, zejména v Safari. Další informace naleznete v tématu Podpora starších prohlížečů v tomto dokumentu.

Testování pomocí Chromu

Chrome 78+ poskytuje zavádějící výsledky, protože má dočasné zmírnění rizik. Dočasné zmírnění rizik pro Chrome 78+ umožňuje soubory cookie starší než dvě minuty. Chrome 76 nebo 77 s povolenými příslušnými testovacími příznaky poskytuje přesnější výsledky. Pokud chcete otestovat nové SameSite chování, přepněte chrome://flags/#same-site-by-default-cookies na Povoleno. Starší verze Chromu (75 a novější) se hlásí, že selhávají s novým None nastavením. Viz Podpora starších prohlížečů v tomto dokumentu.

Google nezpřístupní starší verze chromu. Postupujte podle pokynů ke stažení Chromium a otestujte starší verze Chromu. Nestahujte Chrome z odkazů poskytovaných vyhledáváním starších verzí chromu.

Testování pomocí Safari

Safari 12 striktně implementoval předchozí koncept a selže, když je nová None hodnota v souboru cookie. None se vyhnete prostřednictvím kódu detekce prohlížeče podporujícího starší prohlížeče v tomto dokumentu. Otestujte přihlášení stylu operačního systému Založené na Prohlížeči Safari 12, Safari 13 a WebKitu pomocí knihovny MSAL nebo knihovny, kterou používáte. Problém závisí na základní verzi operačního systému. OSX Mojave (10.14) a iOS 12 znají problémy s kompatibilitou s novým SameSite chováním. Problém řeší upgrade operačního systému na OSX Catalina (10.15) nebo iOS 13. Safari momentálně nemá příznak výslovného souhlasu pro testování nového chování specifikace.

Testování ve Firefoxu

Podporu Firefoxu pro nový standard lze testovat na verzi 68+ výslovným souhlasem na about:config stránce s příznakem network.cookie.sameSite.laxByDefaultfunkce . Ve starších verzích Firefoxu nebyly hlášeny problémy s kompatibilitou.

Testování v prohlížeči Edge

Edge podporuje starý SameSite standard. Edge verze 44 nemá žádné známé problémy s kompatibilitou s novým standardem.

Testování s edgem (Chromium)

SameSite na stránce jsou nastaveny edge://flags/#same-site-by-default-cookies příznaky. U Edge Chromium nebyly zjištěny žádné problémy s kompatibilitou.

Test s elektronem

Verze Elektronu zahrnují starší verze Chromium. Například verze Elektronu, kterou teams používá, je Chromium 66, který vykazuje starší chování. Musíte provést vlastní testování kompatibility s verzí elektronu, kterou váš produkt používá. Viz Podpora starších prohlížečů v následující části.

Další materiály