使用帐户选择

时间:2018-01-04 08:55:03

标签: google-chrome authentication cookies asp.net-core-2.0

使用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中是否出现此问题。可能我根本没有碰到它。

1 个答案:

答案 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.Strictthe 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