


HTTP:浏览器的 SameSite 更改会影响身份验证
某些浏览器(如 Chrome 和 Firefox)对 Cookie 的 SameSite 实现进行了中断性变更。 这些变更会影响 OpenID Connect 和 WS 联合身份验证等远程身份验证方案,必须通过发送 SameSite=None 来选择退出。 但是,SameSite=None 会在 iOS 12 和其他浏览器的某些较早版本上中断运行。 应用需探查这些版本,并忽略 SameSite。
旧行为
SameSite 是对 HTTP Cookie 的 2016 草案标准扩展。 它旨在减少跨站点请求伪造 (CSRF)。 它最初设计成一项功能,服务器可通过添加新参数选择加入该功能。 ASP.NET Core 2.0 添加了对 SameSite 的初始支持。
新行为
Google 提出了一项不向后兼容的新草案标准。 该标准将默认模式更改为 Lax并添加了用于选择退出的新条目 None。Lax 可满足大多数应用 Cookie;但是,它会造成 OpenID Connect 和 WS 联合身份验证登录等跨站点方案中断。 由于请求流程不同,大多数 OAuth 登录不受影响。 新的 None 参数会导致实现先前草案标准的客户端(例如 iOS 12)出现兼容性问题。 Chrome 80 将包含这些更改。 有关 Chrome 产品发布日程表,请查看 SameSite 更新。
已更新 ASP.NET Core 3.1 来实现新的 SameSite 行为。 该更新重新定义了 SameSiteMode.None 的行为以发出 SameSite=None,并添加了一个新值 SameSiteMode.Unspecified 以忽略 SameSite 属性。 现在,所有 Cookie API 都默认为 Unspecified,但某些使用 Cookie 的组件设置了更特定于其方案的值,例如 OpenID Connect 相关性和 nonce Cookie。
有关此方面的其他最新更改,请参阅 HTTP:某些 Cookie SameSite 默认值已更改为 None 。 在 ASP.NET Core 3.0 中,大多数默认值已从 SameSiteMode.Lax 更改为 SameSiteMode.None(但仍使用之前的标准)。
支持旧版浏览器
2016 SameSite 标准要求将未知值视为 SameSite=Strict 值。 因此,任何支持原始标准的旧版浏览器都可能在检测到 SameSite 属性具有 None 值时中断。 如果 Web 应用要支持这些旧版浏览器,它们必须实现浏览器探查。 ASP.NET Core 不会为你实现浏览器探查,因为 User-Agent 请求标头值非常不稳定,每周都会更改。 相反,Cookie 策略中的扩展点允许添加特定于 User-Agent 的逻辑。
在 Startup.cs 中,添加以下代码 :
private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
if (options.SameSite == SameSiteMode.None)
{
var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
// TODO: Use your User Agent library of choice here.
if (/* UserAgent doesn't support new behavior */)
{
options.SameSite = SameSiteMode.Unspecified;
}
}
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
}
public void Configure(IApplicationBuilder app)
{
// Before UseAuthentication or anything else that writes cookies.
app.UseCookiePolicy();
app.UseAuthentication();
// code omitted for brevity
}
“选择退出”开关
通过 Microsoft.AspNetCore.SuppressSameSiteNone 兼容性开关,可暂时选择退出新的 ASP.NET Core Cookie 行为。 将以下 JSON 添加到项目的 runtimeconfig.template.json 文件中 :
{
"configProperties": {
"Microsoft.AspNetCore.SuppressSameSiteNone": "true"
}
}
官方文档:https://docs.microsoft.com/zh-cn/dotnet/core/compatibility/3.0-3.1
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)