在 Chrome 浏览器中处理 SameSite Cookie 更改

什么是 SameSite?

SameSite 是一个属性,可在 HTTP Cookie 中设置该属性,以防止 Web 应用程序遭受跨站点请求伪造 (CSRF) 攻击:

  • SameSite 设置为 Lax 时,将在同一站点内的请求中以及来自其他站点的 GET 请求中发送 Cookie。 不会在跨域的 GET 请求中发送 Cookie。
  • 使用 Strict 值可确保仅在同一站点内的请求中发送 Cookie。

默认情况下,不会在浏览器中设置 SameSite 值,正因如此,在请求中发送的 Cookie 没有限制。 应用程序需要根据要求设置 LaxStrict 来启用 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 是保留 statenonce 值的 Cookie,它们也在登录请求中发送。 Microsoft Entra ID 会丢弃其他用来保留会话的 Cookie。

如果不更新 Web 应用,这种新行为会导致身份验证失败。

缓解措施和示例

若要解决身份验证失败,在 Chrome 浏览器上运行时,对于在跨域方案中使用的 Cookie,通过 Microsoft 标识平台进行身份验证的 Web 应用可将 SameSite 属性设置为 None。 其他浏览器(参阅此处的完整列表)遵循以前的 SameSite 行为,并且在设置了 SameSite=None 时不包含 Cookie。 正因如此,为了在多个浏览器中支持身份验证,Web 应用只能在 Chrome 中将 SameSite 值设置为 None,在其他浏览器中则保留空值。

以下示例代码演示了此方法。

后续步骤

详细了解 SameSite 和 Web 应用方案: