ASP.NET Core 2.1 MVC SameSite-cookie-Beispiel

ASP.NET Core 2.1 verfügt über integrierte Unterstützung für das SameSite-Attribut, wurde jedoch mit dem ursprünglichen Standard geschrieben. Das gepatchte Verhalten hat die Bedeutung von SameSite.None so geändert, dass das SameSite-Attribut mit dem Wert von None ausgegeben wird, anstatt den Wert überhaupt nicht auszugeben. Wenn Sie den Wert nicht ausgeben möchten, können Sie die SameSite-Eigenschaft für ein cookie auf -1 festlegen.

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 für ein 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)(-1).
    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, z. B.

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 Code oben legen sowohl cookie-Authentifizierung als auch der Sitzungszustand ihr sameSite-Attribut auf None fest, geben das Attribut mit einem 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 vor allen Komponenten, die cookies schreiben und in ConfigureServices() konfiguriert werden, in der HTTP-Anforderungspipeline platziert werden.

Verwenden Sie app.UseCookiePolicy() zum Einfügen in die Pipeline der Configure(IApplicationBuilder, IHostingEnvironment)-Methode in Startup.cs. 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 wird. 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)(-1);
        }
    }
}

Die Hilfsfunktion CheckSameSite(HttpContext, CookieOptions):

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

.NET Framework als Ziel

ASP.NET Core und System.Web (ASP.NET 4.x) verfügen über unabhängige Implementierungen von SameSite. Die SameSite-KB-Patches für .NET Framework sind nicht erforderlich, wenn ASP.NET Core verwendet wird, und auch die Mindestanforderung von System.Web SameSite an die Frameworkversion (.NET Framework 4.7.2) gilt nicht für ASP.NET Core.

ASP.NET Core in .NET erfordert die Aktualisierung von NuGet-Paketabhängigkeiten, um die entsprechenden Korrekturen zu erhalten.

Um die ASP.NET Core-Änderungen für .NET Framework zu erhalten, stellen Sie sicher, dass Sie einen direkten Verweis auf die gepatchten Pakete und Versionen (2.1.14 oder höhere 2.1-Versionen) verwenden.

<PackageReference Include="Microsoft.Net.Http.Headers" Version="2.1.14" />
<PackageReference Include="Microsoft.AspNetCore.CookiePolicy" Version="2.1.14" />

Weitere Informationen

Chrome-UpdatesASP.NET Core SameSite-DokumentationASP.NET Core 2.1 SameSite-Änderungsankündigung