浏览器倒逼项目升级: SameSite

2020-03-18  本文已影响0人  gruan

更新最新的 Chrome 之后, 有一些需要跨域访问的资源一直报用户未登陆. 查看 Neetwork 里的请求, 发现这些请求没有把 Session id 带到request 的 cookie 里去. 没有SessionID , 服务端就获取不到 Session, 所以一直是用户未登陆.

之前 Chrome 是不能自动更新的, 要更新都是绕过 GFW , 下载离线包然后安装.
不知从何时开始, Chrome 在国内可以自动更新了. 然后公司里一大票同事的浏览器都自动更新到了最新版. 然后内部系统就爆出了一堆问题...

你妹

跟踪了请求之后, 发现一个问题: SameSite (忘了截图, 不能给你们一个直观的展示).

简单来说, 就是 SameSite 策略禁止了跨域访问的资源发送 cookie.

具体参考文章: 在 ASP.NET 中使用 SameSite cookie

做为一个草头架构师, 我也想把所有系统都给理想化, 无奈这些系统都已年代久远, 不知是哪位大神的神作, 不到万不得已, 是轻易不能改动的, 我能做的就是做一些外围的修补而已.

SameSite

SameSite 有3个可选值 :

默认情况下, 不带 SameSite 标头的 cookie 被视为 SameSite=Lax


没找到具体出处, 从网上流传的文章里截的图

从上图可以看到默认 SameSite = Lax 影响到了 POST / iframe / AJAX / image 这些请求.

要做到最小的修改, 只能使用 None 这个选项.

升级项目

  <system.web>
    ...
    ...
    <compilation targetFramework="4.7.2" debug="true" />
    <httpRuntime targetFramework="4.7.2" ... />
    <httpCookies sameSite="None" requireSSL="true" />
    <sessionState cookieSameSite="None" ... />
    ...
    ...
  </system.web>

如果不使用 https, 结果是这样的:


通过 http 访问, SameSite=None 不起作用

this set-cookie had the "samesite=None" attribute but did not have the "secure" attribute, which is required in order to use "SameSite=None"

用正确的姿势打开 SameSite=None

安装补丁

做完上面这些, 可能你还是看不到 cookie 里有 SameSite=None 这个值 .
很有可能是因为服务器关闭了自动更新. 因为 SameSite 这个选项需要一些特定的补丁:

.NET Framework 中支持 SameSite 的知识库文章

所需的补丁, 请下载对应的版本

其它

https 里访问 http 资源, 同样是会被浏览器给 block 的.
所以在做以上操作的时候, 请先考虑好.

结语

都是浏览器的锅.

上一篇下一篇

猜你喜欢

热点阅读