更新最新的 Chrome 之后, 有一些需要跨域访问的资源一直报用户未登陆. 查看 Neetwork 里的请求, 发现这些请求没有把 Session id 带到request 的 cookie 里去. 没有SessionID , 服务端就获取不到 Session, 所以一直是用户未登陆.
之前 Chrome 是不能自动更新的, 要更新都是绕过 GFW , 下载离线包然后安装.
不知从何时开始, Chrome 在国内可以自动更新了. 然后公司里一大票同事的浏览器都自动更新到了最新版. 然后内部系统就爆出了一堆问题...
跟踪了请求之后, 发现一个问题: SameSite (忘了截图, 不能给你们一个直观的展示).
简单来说, 就是 SameSite 策略禁止了跨域访问的资源发送 cookie.
具体参考文章: 在 ASP.NET 中使用 SameSite cookie
做为一个草头架构师, 我也想把所有系统都给理想化, 无奈这些系统都已年代久远, 不知是哪位大神的神作, 不到万不得已, 是轻易不能改动的, 我能做的就是做一些外围的修补而已.
SameSite
SameSite 有3个可选值 :
- Strict 禁止第三方 cookie
- Lax
- None 关闭 SameSite 选项.
默认情况下, 不带 SameSite 标头的 cookie 被视为 SameSite=Lax
没找到具体出处, 从网上流传的文章里截的图
从上图可以看到默认 SameSite = Lax 影响到了 POST / iframe / AJAX / image 这些请求.
要做到最小的修改, 只能使用 None 这个选项.
升级项目
- .NETFramework 4.7.2 之后才开始支持 SameSite,
- 在 WebConfig 加入以下配置:
<system.web>
...
...
<compilation targetFramework="4.7.2" debug="true" />
<httpRuntime targetFramework="4.7.2" ... />
<httpCookies sameSite="None" requireSSL="true" />
<sessionState cookieSameSite="None" ... />
...
...
</system.web>
- sameSite="None" 必须和 requireSSL="true" 配合使用.
- 站点必须开启 https
如果不使用 https, 结果是这样的:
通过 http 访问, SameSite=None 不起作用
用正确的姿势打开 SameSite=Nonethis set-cookie had the "samesite=None" attribute but did not have the "secure" attribute, which is required in order to use "SameSite=None"
安装补丁
做完上面这些, 可能你还是看不到 cookie 里有 SameSite=None 这个值 .
很有可能是因为服务器关闭了自动更新. 因为 SameSite 这个选项需要一些特定的补丁:
.NET Framework 中支持 SameSite 的知识库文章
其它
https 里访问 http 资源, 同样是会被浏览器给 block 的.
所以在做以上操作的时候, 请先考虑好.
结语
都是浏览器的锅.
网友评论