Ukázka ASP.NET Core 2.1 MVC SameSite cookie
ASP.NET Core 2.1 má integrovanou podporu atributu SameSite , ale byla zapsána do původního standardu. Opravené chování změnilo význam SameSite.None
vygenerování stejného atributuSite s hodnotou None
, místo aby nevysílala hodnotu vůbec. Pokud nechcete vygenerovat hodnotu, můžete vlastnost nastavit SameSite
na cookie hodnotu -1.
ASP.NET Core Identity nejsou soubory cookie SameSite do značné míry ovlivněny s výjimkou pokročilých scénářů, jako IFrames
je nebo OpenIdConnect
integrace.
Pokud používáte Identity
, nepřidávejte žádné cookie poskytovatele ani volání services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
, Identity
postará se o to.
Zápis atributu SameSite
Následuje příklad zápisu atributu SameSite na :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);
Nastavení Cookie souborů cookie pro ověřování a stav relace
Cookie ověřování, stav relace a různé další komponenty nastavují své možnosti sameSite prostřednictvím Cookie možností, například
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;
});
V předchozím kódu cookie nastavují ověřování i stav relace stejný atributSite na None
, vygeneruje atribut s None
hodnotou a také nastaví atribut Secure na true.
Spuštění ukázky
Pokud spustíte ukázkový projekt, na úvodní stránce načtěte ladicí program prohlížeče a použijte ho k zobrazení cookie kolekce webu. Uděláte to tak, že v Prohlížeči Edge a Chromu stisknete klávesu F12
Application
Tab a kliknete na adresu URL webu pod Cookies
možností v oddílu Storage
.
Z výše uvedeného obrázku můžete vidět, že cookie vytvořený ukázkou po kliknutí na tlačítko Vytvořit SameSite Cookiemá hodnotu atributu SameSite , Lax
která odpovídá hodnotě nastavené v ukázkovém kódu.
Zachycení souborů cookie
Pokud chcete zachycovat soubory cookie, upravte žádnou hodnotu podle jeho podpory v agentovi prohlížeče uživatele, musíte použít CookiePolicy
middleware. Musí být umístěn do kanálu požadavku HTTP před všemi komponentami, které zapisuje soubory cookie a konfiguruje v rámci ConfigureServices()
.
Pokud ho chcete vložit do kanálu používaného app.UseCookiePolicy()
Configure(IApplicationBuilder, IHostingEnvironment)
v metodě v Startup.cs. Příklad:
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?}");
});
}
Potom v ConfigureServices(IServiceCollection services)
konfiguraci cookie zásady, aby volal pomocné třídy při připojení nebo odstranění souborů cookie. Příklad:
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);
}
}
}
Pomocná funkce CheckSameSite(HttpContext, CookieOptions)
:
- Volá se, když jsou soubory cookie připojeny k požadavku nebo odstraněny z požadavku.
- Zkontroluje, jestli je vlastnost nastavená
SameSite
naNone
hodnotu . - Je-li
SameSite
nastavenaNone
a aktuální uživatelský agent je známo, že nepodporuje žádnou hodnotu atributu. Kontrola se provádí pomocí třídy SameSiteSupport :- Nastaví
SameSite
hodnotu tak, aby nevysílala hodnotu nastavením vlastnosti na(SameSiteMode)(-1)
- Nastaví
Cílení na rozhraní .NET Framework
ASP.NET Core a System.Web (ASP.NET 4.x) mají nezávislé implementace SameSite. Opravy SameSite KB pro rozhraní .NET Framework nejsou vyžadovány, pokud používáte ASP.NET Core, ani se nevztahuje na požadavek minimální verze rozhraní System.Web SameSite (.NET Framework 4.7.2) na ASP.NET Core.
ASP.NET Core v .NET vyžaduje aktualizaci závislostí balíčků NuGet, aby se získaly příslušné opravy.
Pokud chcete získat změny ASP.NET Core pro .NET Framework, ujistěte se, že máte přímý odkaz na opravené balíčky a verze (verze 2.1.14 nebo novější verze 2.1).
<PackageReference Include="Microsoft.Net.Http.Headers" Version="2.1.14" />
<PackageReference Include="Microsoft.AspNetCore.CookiePolicy" Version="2.1.14" />
Další informace
Dokumentacek aktualizacímChrome ASP.NET Core SameSite ASP.NET Core 2.1 – Oznámení o změnách samesite