使用 SAML 2.0 时出现 CORS 错误

getting CORS error with SAML 2.0

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

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

从一个全新的浏览器开始,用户输入 https://host:port/html 和一个联合登录页面 出现。用户登录,后端服务器 returns 会话 cookie 和对 /js/services 的剩余请求顺利进行。

现在,当用户关闭浏览器并重新打开时,HTML、JS/CSS 将从浏览器缓存中获取。第一次出境 从应用程序到后端服务器的请求是 /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

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

感谢您的帮助,因为我是 SAML 的新手。

----编辑 1

根据 Anders Abel 的回答,我们将以下内容添加到 index.html

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

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

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

但在您匆忙尝试说服您的 Idp 设置 CORS 之前 header,请继续阅读,因为这不是您解决此问题的方式。

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

解决方案是在您的 html 上设置缓存 header,这样它就永远不会被缓存