處理 Chrome 瀏覽器中的 SameSite Cookie 變更
什麼是 SameSite?
SameSite
是一種屬性,可以在 HTTP Cookie 中設定,防止 Web 應用程式遭到跨網站要求偽造 (CSRF) 攻擊:
- 當
SameSite
設定為 [Lax] 時,Cookie 在相同網站中,會以要求傳送,而從其他網站而來的 Cookie,則會以 GET 要求傳送。 跨網域不會以 GET 要求傳送。 - Strict 值可確保 Cookie 在相同的網站中時,才能以要求傳送。
根據預設,瀏覽器中不會設定 SameSite
值,因此不會限制 Cookie 須以要求傳送。 應用程式必須依其需求,設定 [Lax] 或 [Strict]來加入 CSRF 保護。
SameSite 變更及其對驗證的影響
SameSite 標準最近的更新建議,除非此值設為 [Lax],否則 SameSite
的預設行為為保護應用程式。 此風險降低措施表示 Cookie 只能透過來自其他網站的 GET 要求,而無法透過 HTTP 要求。 此外也加入了 [None] 值來移除對所要傳送之 Cookie 的限制。 這些更新很快就會在即將推出的 Chrome 瀏覽器版本中發行。
Web 應用程式使用回應模式 "form_post" 向 Microsoft 身分識別平台進行驗證時,登入伺服器會使用 HTTP POST 回應應用程式,從而傳送權杖或驗證碼。 因為此要求是跨網域要求 (從 login.microsoftonline.com
到您的網域 ,例如 https://contoso.com/auth
),所以您應用程式設定的 Cookie 現在會在 Chrome 新規則的規範之內。 跨網站案例中所要使用的 Cookie,會保存 state 和 nonce 值,也會隨登入要求傳送。 Microsoft Entra ID 會捨棄其他 Cookie 來保存工作階段。
若您未更新您的 Web 應用程式,上述新行為將會導致驗證失敗。
風險降低與範例
為了克服驗證失敗,使用 Microsoft 身分識別平台進行驗證的 Web 應用程式,可以將 Cookie 的 SameSite
屬性設定為 None
,以利其在跨網域案例中,於 Chrome 瀏覽器上執行。
其他瀏覽器 (完整清單請參閱這裡) 仍採有原有的 SameSite
行為,在設定 SameSite=None
的情況下,不會包含 Cookie。
因此,如需支援多個瀏覽器的驗證,Web 應用程式只須在 Chrome 上,將 SameSite
值設定為 [None
],在其他瀏覽器上將此值保留為空白即可。
下列範例程式碼會示範此方法。
下表列出的提取要求,可以暫時解決 SameSite 變更在 ASP.NET 和 ASP.NET Core 範例中的問題。
範例 | 提取要求 |
---|---|
ASP.NET Core Web 應用程式的漸進式教學課程 | SameSite Cookie 修正 #261 |
ASP.NET MVC Web 應用程式範例 | SameSite Cookie 修正 #35 |
active-directory-dotnet-admin-restricted-scopes-v2 | SameSite Cookie 修正 #28 |
如需如何在 ASP.NET 和 ASP.NET Core 中處理 SameSite Cookie 的詳細資訊,另請參閱:
下一步
深入了解 SameSite 與 Web 應用程式案例: