【问题标题】:getting CORS error with SAML 2.0SAML 2.0 出现 CORS 错误
【发布时间】:2016-07-18 21:55:35
【问题描述】:

我在尝试使用 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 将从浏览器缓存中提供出来。第一次出境 从应用程序到后端服务器的请求是到 /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 对话并强制登录,除非用户已经登录。谢谢!

【问题讨论】:

    标签: cors saml-2.0


    【解决方案1】:

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

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

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

    解决方案是在你的 html 上设置一个缓存头,这样它就永远不会被缓存

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-10
      • 2016-12-28
      • 1970-01-01
      • 2017-04-29
      • 2015-12-09
      • 2021-09-21
      • 2023-01-12
      • 2021-10-05
      相关资源
      最近更新 更多