1. 程式人生 > 實用技巧 >Asp.Net Framework 4.0 Cookie SameSite 配置

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