从 Angular 到不同服务器的 GET 调用中不包含 Cookie?

Cookies not included in GET call from Angular to different server?

我们有一个 angular 网站,我们称它为 https://webui.foo.com。我们正在将我们的基础设施转移到 SOA(面向服务的架构),因此我们已经将许多特定于业务的功能卸载到各种服务器上基于 Web api 的端点。

最近,我们从我们的身份验证服务器 (authsvc.foo.com) 构建了对 SSO(单点登录)的 SAML2 支持。标准流程是,webui 有一个 link 用于将它们重定向到 https://authsvc.foo.com/sso/saml2?idp=some-idp&redirectUrl=https://webui.foo.com/sso-response.

之类的客户端

身份验证服务在收到该端点上的请求后,将查找第三方 IDP(身份提供者),加载其元数据,并将质询重定向到 IDP。然后,IDP 将正确地对用户进行身份验证,并向身份验证服务 return 提供一个断言,我们可以使用该断言来验证和识别用户。一旦发生这种情况,身份验证服务将设置一个名为 SSOToken 的短期加密 cookie 仅适用于 https://authsvc.foo.com/api/auth/sso 并发送重定向到原始 URL 中指定的 redirectUrl webui.

接下来应该发生的是 /sso-response 端点(angular 端点)应该立即使用 SSOTokenhttps://authsvc.foo.com/api/auth/sso 执行 http GET 操作cookie,当 authsvc 看到该 cookie 并对其进行验证时,将使用有效的 JWT 和刷新令牌进行响应,以便在我们的 Web 应用程序中使用。

我们可以使用像 https://authsvc.foo.com/sso/saml2?idp=some-idp&redirectUrl=https://authsvc.foo.com/api/auth/sso 这样的 URL 来测试身份验证服务的组件,它会在浏览器上(通过 SAML 身份验证后)向我们显示预期的 JWT 和刷新令牌...所以这部分似乎工作正常。

但是...当我们从 \sso-response angular 端点获取 https://authsvc.foo.com/api/auth/sso 时,我们得到一个 401。查看请求,我们看到 SSOToken cookie根本不包含在请求中...这看起来很奇怪,因为它似乎应该从浏览器自动设置,但显然没有这样做。

我们已经阅读了一些关于使用 withCredentials 的内容,但这似乎没有任何区别。还有一些关于 CORS 的讨论,但我们没有收到任何 CORS 错误或警告...我们只是没有将 cookie 附加到请求,即使浏览器肯定知道 cookie。

这是怎么回事?我们做错了什么?抱歉,我不是 angular 人(我在身份验证服务器上构建了 SAML 支持),所以我对前端需要发生(或不发生)什么才能完成这项工作的理解让我难以理解。

cookie 是如何设置的,有哪些选项和配置?

Cookie 有一个 "Domain" 部分告诉浏览器它属于哪里。
如果您希望将它发送给所有子域,例如 webui.foo.comauthsvc.foo.com,您需要在域前设置一个点的 cookie,例如 .foo.com

您的 angular 端点 \sso-response 可能不知道有一个 cookie 需要附加到请求中。

看看youtube如何设置cookie域:

原来罪魁祸首是 SameSite Cookie 属性。我已将其设置为 "Lax",认为这将允许跨站点通信工作......但没有。显然,现代浏览器在没有确保 cookie 上有 "Secure" 属性 的情况下对此不以为然。谁知道?我想这是有道理的,但这并不是我真正需要担心的跨站点安全问题,所以它不在我的考虑范围内。

我最后所做的是将 Cookie 属性更改为 SameSite=None; Secure,并且 cookie 随请求一起传输。我希望我仍然可以将 Lax 设置与 Secure 设置一起使用,但我发现了一些有用的东西,所以我会继续使用它。