关于cookie中sessionid丢失的问题排查和解决--samesite(客户端app、服务器端asp.net)
问题描述:
App登录后,访问接口失败,后台调试发现sessionid丢失。android手机有问题,ios没有问题。访问服务器没有问题,访问测试服务器有问题。
基本环境:
客户端h5+ App应用,编译器HbuilderX;服务器端asp.net。
问题排查:
通过手机抓包工具Fidder(如何使用参考我另外一篇微博)查看,发现第一次调用接口时,sessionid没有被缓存和提交给服务器。后续每次访问都相当于重新发起请求。
第一次调用接口,有返回sessionid
第二次调用接口,没有把sessionid传给后台,导致后台又返回了sessionid
cookie中没有sessionid
但前后台代码都没有做任何修改,且没有手动对cookie做操作,所以不可能是代码的原因。
同时发现部署到服务器,接口是可以访问的。于是比较了区别
SameSite
本地环境是iis10.0的,服务器是iis7.5。返回的参数中多了SameSite=Lax的设置。SameSite相关说明请查看阮一峰的博客
当设置lax时,大部分情况不发送第三方Cookie。
结论:
所以问题很明显了,iis 10.0环境导致cookie默认参数中带了samesite参数。而这个参数将导致cookie不发送到服务器。需要手动将samesite设置为None。
解决方案:
具体如何设置samesite,参考
webconfig中设置
<rewrite> <outboundRules> <rule name="RemoveSameSiteCookieFlag"> <match serverVariable="RESPONSE_Set-Cookie" pattern="^(.*ASP.NET_SessionId.*)(; SameSite=Lax)(.*)$" /> <action type="Rewrite" value="{R:1}{R:3}" /> </rule> </outboundRules> </rewrite>
再次查看 samesite属性已经消失,sessionid也被缓存了。