Chrome 升級到80以后版本,系統出現了Cookie異常,主要表現有:
1、F12開發工具提示“
”2、后台二次修改Cookie信息不成功,例如設置Cookie的過期時間不能生效(FireFox正常,Chrome修改失敗)。
關於SameSite的一些說明在這里就不過多說了,可以參考下面這些鏈接。
微軟配置文檔: https://docs.microsoft.com/zh-cn/aspnet/samesite/system-web-samesite
SameSite說明:http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
Asp.Net Framework4.7x后的版本中,Cookie對象有SameSite屬性可以直接配置,但是在此之前的EF版本中需要更多的配置,具體可以看上面微軟配置文檔:
1、在Web.Config中配置httpCookies的SameSite屬性:
<system.web> <httpCookies sameSite="Lax" requireSSL="false" /> </system.web>
2、當配置完Config后Cookie初次輸出,Response Headers的Set-Cookies配置中會自動帶上“SameSite=Lax”屬性。
同時瀏覽器的Cookies列表,SameSite列會展示該屬性值
當看到這個結果的時候算是成功一半了, 但是在Cookie在二次修改時, 例如我在退出登錄時,需要更改Cookie的過期時間:
這段代碼看起來好像沒毛病,但是瀏覽器返回的Set-Cookies中,SameSite的值始終是“None”,可能是安全級別不同,在Chrome瀏覽器中這段Cookie值不會覆蓋瀏覽器原有的值,因此我的退出功能失敗:
由於在EF4.0中HttpCookie沒有SameSite屬性,因此很難調試結果,最終判斷可能是請求的Cookie中因為沒有帶SameSite的屬性,但是我又想為何初次寫入Cookie時能夠智能的從Web.Config中讀取httpCookie sameSite的配置,第二次卻不行,用的同樣是HttpContext.Current.Response.SetCookie()方法,最后用了個最傻的辦法,重新創建一個HttpCookie對象,將請求中攜帶的“Cookie寫入到該對象再輸出,果然最終的結果是Headers中已經帶上SameSite=Lax屬性了。
HttpCookie reqCookie = HttpContext.Current.Request.Cookies[_CookieName]; if (reqCookie != null) { HttpCookie cookie = new HttpCookie(_CookieName); foreach (string item in reqCookie.Values.AllKeys) { cookie.Values.Add(item, reqCookie.Values[item]); } cookie.Expires = DateTime.Now.AddHours(houre); HttpContext.Current.Response.SetCookie(cookie); }
通過這兩個方法,最終實現了SameSite=Lax的配置,並且用戶退出功能也恢復正常了。但是我依然在想為啥第二次輸出Cookie的時候SameSite=None,如果你知道或者有見解請一定留言告訴我!