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 , None
anziché 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);
Impostazione dei cookie di Cookie autenticazione e stato sessione
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 .
È 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 Lax
a , 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 suNone
. - Se
SameSite
è impostato suNone
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)
- Imposta
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