Asp.Net Framework 4.0 Cookie SameSite 配置 - Evan.Yu

时间:2024-02-21 11:38:18

Asp.Net Framework 4.0 Cookie SameSite 配置

Chrome 升级到80以后版本,系统出现了Cookie异常,主要表现有:

  1、F12开发工具提示“A cookie associated with a cross-site resource at http://ip/ was set without the SameSite attribute

  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,如果你知道或者有见解请一定留言告诉我!