使用 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,这样它就永远不会被缓存。
我在尝试使用 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,这样它就永远不会被缓存。