[更新-见最后评论]
Google 将更改其 Chrome 浏览器的行为,以便 cookie 在托管在另一个域的 IFRAME 中时不再起作用,除非 cookie 明确设置为 SameSite = None 和 Secure。
为此,我们在 ASP.NET MVC 代码中进行了此更改。我们有一些关于何时设置的逻辑(仅适用于我们同意合作的合作伙伴),所以我们有这个条件逻辑:
if (isSameSiteCookieEnforced)
{
cookie.SameSite = SameSiteMode.None;
cookie.Secure = true;
}
我们在我们的 DEV、QA、STAGE 环境中对此进行了测试,它运行良好。在 Chrome 的开发人员工具(应用程序 > Cookies)中,您可以检查 cookie 并查看它们都标记为安全,并且在 SameSite 列中没有。
但是,当我们将其滚动到我们的 PROD 环境时,使用相同的浏览器会得到不同的结果:cookie 被标记为安全,但 SameSite 值为空。
我们检查的内容:
- 负载均衡器:我们将其隔离并直接导航到单个 Web 服务器,结果相同
- 安装的 .NET 框架:在所有环境中,我们都安装了 4.7.2 和 4.8
- 解决 .NET 框架:在所有环境中,web.config 规定 4.7.2
- 代码:我们从 PROD 中检索了相关的 DLL 并使用 ILSPY 进行了检查。它包含上面的代码
目前有点不知所措,无法解释 cookie 如何丢失“SameSite”属性。导航到chrome://flags并在SameSite上进行过滤,我们将这三个设置显示为“默认”,因此 Chrome 不应影响从一个环境到另一个环境的任何不同。
更新
我们的 ASP.NET MVC 应用程序使用 IHttpModule,作为 EndRequest 方法的最后一步,我们跟踪 cookie。您可以清楚地看到它们设置为 SameSite=None 和 Secure=true。但是,当它们到达浏览器时,SameSite 属性已被剥离。