1、關於SameSite的介紹瀏覽器
1. 什麼是SameSite?服務器
SameSite是瀏覽器請求中Set-Cookie響應頭新增的一種屬性,它用來標明這個 cookie 是不是「同站 cookie」,同站 cookie 只能在本域名中使用的cookie,不能做爲第三方 cookie。cookie
Chrome 51 開始,瀏覽器的 Cookie 新增長了一個SameSite屬性,用來防止 CSRF 攻擊和用戶追蹤。該屬性起初是由Google 起草的一份草案用來來改進 HTTP 協議的。
網絡
2. 爲何要用SameSite?session
用來防止 CSRF 攻擊和用戶追蹤。Cookie 每每用來存儲用戶的身份信息,惡意網站能夠設法僞造帶有正確 Cookie 的 HTTP 請求,這就是 CSRF 攻擊。網站
3. 在.Net Core3.1中如何使用SameSite?spa
用戶想要在.Net Core3.1中使用該屬性(以SameSite=None爲例),則應在Startup.cs中配置如下代碼:3d
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.None; });
2、使用SameSite時的具體使用code
在.Net Core3.1中使用SameSite屬性應注意如下幾點:blog
(1)Strict 最爲嚴格,徹底禁止第三方 Cookie,跨站點時,任何狀況下都不會發送 Cookie。換言之,只有當前網頁的 URL 與請求目標一致,纔會帶上 Cookie。
(2) Lax
規則稍稍放寬,大多數狀況也是不發送第三方 Cookie,可是導航到目標網址的 Get 請求除外。
(3)Chrome 計劃將Lax
變爲默認設置。這時,網站能夠選擇顯式關閉SameSite
屬性,將其設爲None (對舊版瀏覽器無效,由於舊版瀏覽器沒有該值)
。不過,前提是必須同時設置Secure
屬性(Cookie 只能經過 HTTPS 協議發送),不然無效。
下面的設置無效
Set-Cookie: widget_session=abc123; SameSite=None
//瀏覽器警告提示
下面的設置有效
Set-Cookie: widget_session=abc123; SameSite=None; Secure
(4)Unspecified表示不指定SameSite屬性。這意味着,瀏覽器不會將 SameSite 屬性添加到Set-Cookie中而且客戶端將使用其默認行爲 (對舊版瀏覽器無效,由於舊版瀏覽器沒有該值) 。
(5)設置Secure屬性,該屬性在SameSite=None的場景下使用(以SameAsRequest爲例)
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified; options.Secure = CookieSecurePolicy.SameAsRequest; });
該屬性配置的枚舉值有如下幾個:
SameAsRequest:若是提供 cookie 的 URI 是 HTTPS,則 cookie 僅會在後續的 HTTPS 請求上返回到服務器。 不然,若是提供 cookie 的 URI 爲 HTTP,則 cookie 將在全部 HTTP 和 HTTPS 請求上返回到服務器。 此值可確保已部署服務器上的全部通過身份驗證的請求使用 HTTPS,還支持將 HTTP 用於本地主機開發和不支持 HTTPS 的服務器。
Always:Secure 始終標記爲 true。 當登陸頁以及須要身份驗證標識的全部後續頁是 HTTPS 時,請使用此值。 本地開發也須要使用 HTTPS URL 來完成。
None:Secure 未標記爲 true。 當登陸頁爲 HTTPS,但站點上的其餘 HTTP 頁也須要身份驗證信息時,請使用此值。 不建議使用此設置,由於本地網絡或無線鏈接中的其餘計算機可能會觀察到並使用隨 HTTP 請求提供的身份驗證信息。
3、遇到的問題
按照SameSite=None的解釋,一是這表示容許Cookie的使用,二是必須配合Secure的設置。
那麼當配置Secure的時候,按照文檔的解釋,配置爲CookieSecurePolicy.SameAsRequest時,不管是https仍是http的場景下,用戶登陸應該都是沒有問題的(由於用戶登陸信息存在cookie中了)。
但實際上以上個人配置並不生效,瀏覽器老是提示
說明沒有標記secure成功(此時瀏覽器用不了cookie,系統老是會跳到登陸頁面)!
我也查了一下資料,說是這種狀況Cookie 只能經過 HTTPS 協議發送,我也確實是證明了在https下是能夠正常登陸的。
具體是什麼緣由,我也不知道,也可能就是規定這麼用,這裏有待大神指點!!!
4、解決辦法
1. 把SameSite設置爲了Unspecified,此時瀏覽器不存在SameSite屬性,就不會出現cookie的任何問題。
2. 把域名搞成https,而後SameSite=None配合Secure=SameAsRequest使用,也能夠正常使用cookie
本人小白,大神勿噴!