这个问题是我们总部的一个外部应用,给到我们的客户每家一个iframe的嵌套页面,通过计算handshake的动态值,实现免登录的。这其中用到了Cookie和服务器端的Form认证。
伴随着谷歌浏览器(80版本之后对cookie的校验更加严格,SameSite属性默认值由None变为Lax)的升级,iframe中的Cookie跨域被默认禁用了,除非SameSite为None并Secure属性为True(强制SSL启用HTTPS访问)
经过印度第三方外包公司45天的调查处理,仍未解决。
经过远程会议,了解了现在团队已经做过的尝试,大的方向没错,目前未能解决的问题是
无法将2个Cookie的SameSite写成None
.ASPXAUTH
ASP.NET_SessionId
一开始我以为改用最原始的HTTPCookie的方式写就行了,但是这两个Cookie就是无法赋值。微软官网建议的在Web.config和Global.asax设置也没用。
好在透过Google看到有人提到用URL Rewrite工具,果然有效。
最终解决方案,用URL重写工具,在system.webServer节点写入Outbound规则如下:
<rewrite>
<outboundRules>
<rule name="AddSameSiteCookieFlag">
<match serverVariable="RESPONSE_Set-Cookie" pattern="^(.*)(ASP.NET|ASPXAUTH|SessionId)(=.*)$" />
<action type="Rewrite" value="{R:0};SameSite=None" />
</rule>
</outboundRules>
</rewrite>
而原有的<forms />认证信息中,必须加入requireSSL=”true”,总共涉及9行代码。
最终印度第三方外包公司的同事高高兴兴的去部署到服务器了。