ASP.NET - Request.Cookies 不再适用于 Chrome V80+

ASP.NET - Request.Cookies no longer working in Chrome V80+

毫无疑问与最近发布的 Chromes samesite cookie 政策有关,我现在在 ASP.NET 中更新 cookie 时遇到问题。


我有一个简单的 cookie 集合来存储基本的用户设置。 使用以下代码生成和更新 cookie。

设置 COOKIE

If Response.Cookies("Settings") IsNot Nothing Then
  Dim cookie As HttpCookie = Request.Cookies("Settings")
  cookie("Setting01") = ddl.SelectedValue
  cookie.Expires = Date.Now.AddDays(365)
  Response.Cookies.Add(cookie)
End If

首次创建 cookie 时,它​​正确显示如下。

更新设置并第二次调用上面的代码时,该值将被删除。


这只发生在 Chrome 并且仅在我更新到 Chrome V84

之后

我最近在 web.config 中进行了以下更改以适应 samesite 要求。

<sessionState cookieless="false" cookieSameSite="None" />
<httpCookies httpOnlyCookies="true" sameSite="None" requireSSL="true" />

问题出在哪里?

就是这部分代码现在returns什么都没有

Request.Cookies("Settings")

解决方案

此问题是由于在创建新 cookie 时未在代码隐藏中明确设置 SameSiteMode 造成的。

If Response.Cookies("Settings") IsNot Nothing Then
  Dim cookie As HttpCookie = Request.Cookies("Settings")
  cookie("Setting01") = ddl.SelectedValue
  cookie.Expires = Date.Now.AddDays(365)

  cookie.SameSite = SameSiteMode.Lax

  Response.Cookies.Add(cookie)
End If

另外设置SameSiteMode.None将不起作用。大概是为了强制该 cookie 源自同一站点。


但是为什么?

我仍然不完全理解为什么会这样,因为如果你设置 web.config

<httpCookies httpOnlyCookies="true" sameSite="Lax" requireSSL="true" />

然后您新创建的 cookie 在 Chrome 中被标记为 Lax 并且更改此设置反映如下:

但是,如果您现在尝试从后面的代码中读取该 cookie,它的值将被删除。 不是这样的,是你专门在后面的代码中设置的。

我不确定是什么让 cookie 与众不同,更可能是 .NET 处理它的方式的问题。


关于这个答案的任何额外情报都会很有趣。

截至 2020 年 8 月 11 日,Chromium 现在针对 100% 的用户更改了 SameSite cookie。 (来源:https://www.chromium.org/updates/same-site

SameSite cookie 常见问题解答:https://www.chromium.org/updates/same-site/faq