使用 SAML 2.0 出现 CORS 错误

Din*_*esh 5 cors saml-2.0

尝试使用 SAML 2.0 对访问进行身份验证时出现 CORS 错误,我完全不知所措。

我们有一个后端 Web 服务器,它提供 3 个不同的路径/html /js/services. 我们已经定义了一个 SAML ID 提供者,导入了 IDP 元数据并在服务器端配置了一个服务,其中服务 url 已设置为/html。这生成了一些已在 IDP 世界端注册的元数据 xml。

从新的浏览器开始,用户输入https://host:port/html并显示联合登录页面。用户登录后,后端服务器返回会话cookies和剩余请求/js/services顺利运行​​。

现在,当用户关闭浏览器并重新打开时,HTML、JS/CSS 将从浏览器缓存中提供。从应用程序到后端服务器的第一个出站请求是 to/services/a-service-name并且失败并显示以下内容:

XMLHttpRequest cannot load https://fed.xxx.com/fed/idp/samlv20?SAMLRequest=some-charater-string. 
No 'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'https://my-host:port' is therefore not allowed access.

NETWORK ERROR; xhr= 0 error ; settings= GET /services/a-service-name <<<<<<<<<< this print is from my app
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?我需要在我的后端服务器端创建 3 个服务提供者(即/html, /js, /services)吗?或者,我的应用程序是否需要捕获和解释 SAML 请求?

将感谢一些帮助,因为我对 SAML 非常陌生。

----编辑 1

根据安德斯·阿贝尔的回答,我们添加了以下内容 index.html

<script>
  if(window.location.search.length == 0){
    window.location = "index.html?"+Math.random();
  }
</script>
Run Code Online (Sandbox Code Playgroud)

这会强制命中指定的 SP,触发与联盟的 SAML 对话并强制登录,除非用户已经登录。谢谢!

And*_*bel 9

当您在重新打开的浏览器中访问该站点时,没有建立与应用程序的会话。第一个请求到达服务器,因为您发现了来自 JavaScript 的 ajax 请求。该请求触发 SAML 登录序列并通过重定向到 Idp 进行回复。这就是问题出现的地方 - idp 没有设置允许您的 Javascript 加载它的 CORS 标头。

但在您急于说服您的 Idp 设置 CORS 标头之前,请继续阅读,因为这不是您应该解决此问题的方法。

SAML2 是在 ajax 调用出现之前的古代设计的,因此它与它一起工作非常糟糕。您想要做的是确保每次用户打开应用程序时都从服务器加载 HTML 页面。这样,如果需要,HTML 加载将触发 SAML2 登录流程,一切都会正常进行。

解决方案是在 html 上设置一个缓存标头,以便它永远不会被缓存