尝试使用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对话框并强制登录,除非用户已经登录。谢谢!
答案 0 :(得分:2)
当您在重新打开的浏览器中访问该站点时,没有与该应用程序建立的会话。第一个命中服务器的请求,因为您已经从JavaScript中找到了ajax请求。该请求触发SAML登录序列,并通过重定向到Idp进行回复。这就是问题出现的地方 - idp没有设置允许你的Javascript加载它的CORS标头。
但是在你急于试图说服你的Idp设置一个CORS标题之前,请继续阅读,因为那不是你应该如何解决这个问题。
SAML2的设计是在ajax调用已知之前的远古时代,所以它与它一起工作得非常糟糕。您要做的是确保每次用户打开应用程序时从服务器加载HTML页面。这样,HTML加载将在需要时触发SAML2登录流程,一切都会正常工作。
解决方案是在html上设置缓存标头,以便永远不会缓存。