SAML 2.0出现CORS错误

时间:2016-03-30 18:14:29

标签: cors saml-2.0

尝试使用SAML 2.0对访问进行身份验证时出现CORS错误,我完全失败了。

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

从新浏览器开始,用户键入https://host:port/html和联合登录页面 出现。用户登录后,后端服务器返回会话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对话框并强制登录,除非用户已经登录。谢谢!

1 个答案:

答案 0 :(得分:2)

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

但是在你急于试图说服你的Idp设置一个CORS标题之前,请继续阅读,因为那不是你应该如何解决这个问题。

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

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