在 Chrome 浏览器中处理 SameSite Cookie 更改
什么是 SameSite?
SameSite
是一个属性,可在 HTTP Cookie 中设置该属性,以防止 Web 应用程序遭受跨站点请求伪造 (CSRF) 攻击:
- 当
SameSite
设置为 Lax 时,将在同一站点内的请求中以及来自其他站点的 GET 请求中发送 Cookie。 不会在跨域的 GET 请求中发送 Cookie。 - 使用 Strict 值可确保仅在同一站点内的请求中发送 Cookie。
默认情况下,不会在浏览器中设置 SameSite
值,正因如此,在请求中发送的 Cookie 没有限制。 应用程序需要根据要求设置 Lax 或 Strict 来启用 CSRF 保护。
SameSite 更改以及对身份验证的影响
最近对 SameSite 标准所做的更新提议在未将任何值设置为 Lax 时,通过产生默认的 SameSite
行为来保护应用。 此缓解措施意味着,HTTP 请求(从其他站点发出的 GET 除外)中的 Cookie 将受到限制。 此外,引入了 None 值来消除对所发送 Cookie 的限制。 这些更新即将在下一个 Chrome 浏览器版本中发布。
当 Web 应用使用响应模式“form_post”通过 Microsoft 标识平台进行身份验证时,登录服务器将使用 HTTP POST 来响应应用程序,以发送令牌或授权代码。 由于这是一个跨域请求(从 login.partner.microsoftonline.cn
发送到域 - 例如 )https://contoso.com/auth
,因此应用设置的 Cookie 现在需要遵守 Chrome 中的新规则。 需要在跨站点方案中使用的 Cookie 是保留 state 和 nonce 值的 Cookie,它们也在登录请求中发送。 Microsoft Entra ID 会丢弃其他用来保留会话的 Cookie。
如果不更新 Web 应用,这种新行为会导致身份验证失败。
缓解措施和示例
若要解决身份验证失败,在 Chrome 浏览器上运行时,对于在跨域方案中使用的 Cookie,通过 Microsoft 标识平台进行身份验证的 Web 应用可将 SameSite
属性设置为 None
。
其他浏览器(参阅此处的完整列表)遵循以前的 SameSite
行为,并且在设置了 SameSite=None
时不包含 Cookie。
正因如此,为了在多个浏览器中支持身份验证,Web 应用只能在 Chrome 中将 SameSite
值设置为 None
,在其他浏览器中则保留空值。
以下示例代码演示了此方法。
下表展示了可以解决 ASP.NET 和 ASP.NET Core 示例中的 SameSite 更改的拉取请求。
示例 | 拉取请求 |
---|---|
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 应用方案: