ASP.NET Core 3.1 Razor Pages: Beispiel für SameSite-cookie

ASP.NET Core 3.0 bietet integrierte Unterstützung für das SameSite-Attribute, einschließlich des Werts Unspecified für das Attribut SameSiteMode, mit dem das Schreiben des Attributs unterdrückt wird.

ASP.NET Core Identity ist von SameSite cookies weitgehend unbeeinflusst, außer bei erweiterten Szenarien wie der Integration von IFrames oder OpenIdConnect.

Wenn Sie Identity verwenden, fügen Sie keinecookie-Anbieter hinzu, und rufen Sie services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) nicht auf. Identity übernimmt dies.

Schreiben des SameSite-Attributs

Im Folgenden finden Sie ein Beispiel für das Schreiben eines SameSite-Attributs in einem 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 the SameSite property to SameSiteMode.Unspecified.
    SameSite = SameSiteMode.None
};

// Add the cookie to the response cookie collection
Response.Cookies.Append(CookieName, "cookieValue", cookieOptions);

Cookie-Authentifizierung, Sitzungszustand und verschiedene andere Komponenten legen ihre SameSite-Optionen über Cookie-Optionen fest. Beispiel:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.Cookie.SameSite = SameSiteMode.None;
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        options.Cookie.IsEssential = true;
    });

services.AddSession(options =>
{
    options.Cookie.SameSite = SameSiteMode.None;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
    options.Cookie.IsEssential = true;
});

Im oben gezeigten Code legen sowohl die cookie-Authentifizierung als auch der Sitzungszustand ihr SameSite-Attribut auf „None“ fest, geben das Attribut mit dem Wert None aus und legen auch das Secure-Attribut auf „true“ fest.

Ausführen des Beispiels

Wenn Sie das Beispielprojekt ausführen, laden Sie Ihren Browserdebugger auf der ersten Seite, und verwenden Sie ihn, um die cookie-Sammlung für die Website anzuzeigen. Drücken Sie dazu in Edge und Chrome F12, wählen Sie die Registerkarte Application aus, und klicken Sie unter der Option Cookies im Abschnitt Storage auf die Website-URL.

Browser Debugger Cookie List

Sie können in der Abbildung oben erkennen, dass das vom Beispiel beim Klicken auf die Schaltfläche „SameSite-Cookie erstellen“ erstellte cookie den SameSite-Attributwert von Lax aufweist und so dem im Beispielcode festgelegten Wert entspricht.

Abfangen von cookies

Wenn Sie cookies abfangen möchten, müssen Sie die CookiePolicy-Middleware verwenden, um den none-Wert entsprechend seiner Unterstützung im Browser-Agent der Benutzer*innen anzupassen. Dies muss in der HTTP-Anforderungspipeline vor allen Komponenten platziert werden, die cookies schreiben, und in ConfigureServices() konfiguriert werden.

Verwenden Sie zum Einfügen in die Pipeline app.UseCookiePolicy() in der Configure(IApplicationBuilder, IHostingEnvironment)-Methode in Ihrer Startup.cs-Datei. Beispiel:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
       app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseAuthentication();
    app.UseSession();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Konfigurieren Sie dann in ConfigureServices(IServiceCollection services) die cookie-Richtlinie so, dass eine Hilfsklasse aufgerufen wird, wenn cookies angefügt oder gelöscht werden. Beispiel:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
        options.OnAppendCookie = cookieContext =>
            CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
        options.OnDeleteCookie = cookieContext =>
            CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
    });
}

private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
    if (options.SameSite == SameSiteMode.None)
    {
        var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
        if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
        {
            options.SameSite = SameSiteMode.Unspecified;
        }
    }
}

Für die Hilfsfunktion CheckSameSite(HttpContext, CookieOptions) gilt Folgendes:

  • Sie wird aufgerufen, wenn cookies an die Anforderung angefügt oder aus der Anforderung gelöscht werden.
  • Sie überprüft, ob die SameSite-Eigenschaft auf None festgelegt ist.
  • Wenn SameSite auf None festgelegt ist und der aktuelle Benutzer-Agent den Attributwert „none“ bekanntermaßen nicht unterstützt. Die Überprüfung erfolgt mithilfe der SameSiteSupport-Klasse:
    • Sie legt SameSite so fest, dass der Wert nicht ausgegeben wird, indem sie die Eigenschaft auf (SameSiteMode)(-1) festlegt.

Weitere Informationen

Chrome-UpdatesASP.NET Core-SameSite-Dokumentation