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