Asp.Net Framework 4.0 Cookie SameSite 配置
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,如果你知道或者有见解请一定留言告诉我!