Condividi tramite


Esempio samesite cookie di ASP.NET Core 2.1 Razor Pages

Questo esempio è destinato a .NET Framework mirato

ASP.NET Core 2.1 include il supporto predefinito per l'attributo SameSite , ma è stato scritto nello standard originale. Il comportamento con patch ha modificato il significato di SameSite.None per generare lo stesso attributoSite con un valore , Noneanziché generare il valore. Se si desidera non generare il valore, è possibile impostare la SameSite proprietà su su cookie -1.

ASP.NET Core Identity non è in gran parte interessato dai cookie SameSite, ad eccezione di scenari avanzati come IFrames o OpenIdConnect integrazione.

Quando si usa Identity, non aggiungere cookie provider o chiamare services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme), Identity si occupa di questo.

Scrittura dell'attributo SameSite

Il codice seguente è un esempio di come scrivere un attributo SameSite in un cookieoggetto :

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 autenticazione, stato sessione e vari altri componenti impostano le stesse opzionisite tramite Cookie opzioni, ad esempio

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;
});

Nel codice precedente, sia l'autenticazione che cookie lo stato sessione impostano lo stesso attributoSite su None, generando l'attributo con un None valore e impostando anche l'attributo Secure su true.

Eseguire l'esempio

Se si esegue il progetto di esempio, caricare il debugger del browser nella pagina iniziale e usarlo per visualizzare la cookie raccolta per il sito. A tale scopo, in Edge e Chrome premere F12 , quindi selezionare la Application scheda e fare clic sull'URL del sito sotto l'opzione Cookies nella Storage sezione .

Elenco debugger browser Cookie

È possibile osservare dall'immagine precedente che l'oggetto cookie creato dall'esempio quando si fa clic sul pulsante "Create SameSite" ha un valore dell'attributo SameSite Cookiepari Laxa , che corrisponde al valore impostato nel codice di esempio.

Intercettazione dei cookie

Per intercettare i cookie, per regolare il valore none in base al supporto dell'agente browser dell'utente, è necessario usare il CookiePolicy middleware. Questa operazione deve essere inserita nella pipeline di richiesta HTTP prima di tutti i componenti che scrivono cookie e configurati all'interno di ConfigureServices().

Per inserirlo nella pipeline da usare app.UseCookiePolicy() nel Configure(IApplicationBuilder, IHostingEnvironment) metodo nel Startup.cs. Ad esempio:

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?}");
    });
}

Quindi nel ConfigureServices(IServiceCollection services) configurare il cookie criterio per chiamare una classe helper quando i cookie vengono aggiunti o eliminati, come in questo caso;

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);
        }
    }
}

Funzione helper CheckSameSite(HttpContext, CookieOptions):

  • Viene chiamato quando i cookie vengono aggiunti alla richiesta o eliminati dalla richiesta.
  • Verifica se la SameSite proprietà è impostata su None.
  • Se SameSite è impostato su None e l'agente utente corrente non supporta il valore dell'attributo none. Il controllo viene eseguito usando la classe SameSiteSupport :
    • Imposta SameSite per non generare il valore impostando la proprietà su (SameSiteMode)(-1)

Destinazione di .NET Framework

ASP.NET Core e System.Web (ASP.NET 4.x) hanno implementazioni indipendenti di SameSite. Le patch SameSite KB per .NET Framework non sono necessarie se si usa ASP.NET Core né il requisito di versione minima del framework System.Web SameSite (.NET Framework 4.7.2) si applica a ASP.NET Core.

ASP.NET Core in .NET richiede l'aggiornamento delle dipendenze del pacchetto NuGet per ottenere le correzioni appropriate.

Per ottenere le modifiche di ASP.NET Core per .NET Framework, assicurarsi di avere un riferimento diretto ai pacchetti e alle versioni con patch (2.1.14 o versioni successive 2.1).

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

Ulteriori informazioni

Chrome aggiornaASP.NET documentazionecore samesite ASP.NET Core 2.1 SameSite Change Announcement