使用ASP.NET Core 1.1,我设置了基于cookie的TempData
。在此键/值存储区中,我在登录到外部登录提供程序(Google)之前存储了临时数据,我在验证请求的回调中检索了该数据。
这很有用,我不记得有任何问题。
我现在升级到ASP.NET Core 2.0。其中一项更改是基于cookie的TempData
现在默认配置。实际上,在删除配置时,仍然可以检索使用Google身份验证登录时临时存储的数据。
但是,我现在注意到,当在Google Chrome中配置多个Google帐户并且用户需要选择要登录的帐户时,此操作会失败。如果只配置了一个帐户,则无需进行任何交互,用户将自动登录,并且可以检索TempData
。
调试这个,我注意到编写了cookie(可以在Chrome设置中看到它),甚至在调用身份验证回调时仍然存在。无论如何,查询时TempData
为空。由于无法找到预期的密钥,因此只会在Chrome设置中不再显示Cookie,因此会发生异常。有趣的是,只删除了TempData
cookie。更有趣的是, Microsoft Edge上不会出现此问题!
我做错了什么或者这是一个错误?我不确定ASP.NET 1.0中是否出现此问题。可能我根本没有碰到它。
答案 0 :(得分:0)
ASP.NET Core 2.0中的这个seems to be a bug, or at least unexpected behavior,。
作为Tratcher pointed out in the GitHub issue I created,,这与newly introduced SameSite
option for cookies。
SameSite会阻止浏览器一起发送此cookie 跨站请求。
ASP.NET MVC' CookieTempDataProvider
默认为SameSiteMode.Strict
,the Open Web Application Security Project documents as:
严格的值将阻止cookie被发送 浏览器到目标站点的所有跨站点浏览上下文,甚至 关注常规链接时。
因此,解决方案是将其设置为SameSiteMode.Lax
,记录为:
默认的宽松值可在安全性之间提供合理的平衡 和想要维护用户登录的网站的可用性 用户从外部链接到达后的会话。在上面 GitHub场景,在跟随a时允许会话cookie 来自外部网站的常规链接,同时在CSRF易于阻止它 请求方法(例如POST)。
可以通过将以下代码添加到Startup.ConfigureServices()
:
// Ensure TempData cookies do not get cleared when using external Google Authentication.
services.Configure<CookieTempDataProviderOptions>( options =>
{
options.Cookie.SameSite = SameSiteMode.Lax; // By default this is set to 'Strict'.
} );
它适用于Microsoft Edge的原因是(在撰写本文时)Edge尚不支持SameSite
。