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
毫无疑问与最近发布的 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