問題描述:
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也被緩存了。


