【问题标题】:Shibboleth SSO CORS errorShibboleth SSO CORS 错误
【发布时间】:2016-01-03 22:48:31
【问题描述】:
我们的应用程序(AngularJS + REST)受 Shibboleth 服务提供商的 SSO 保护。
问题是我们在尝试对 REST 服务进行 ajax 调用时看到 CORS 错误,说重定向到 IDP 失败“跨源请求被阻止:同源策略不允许读取远程资源”
但是,如果我们刷新/重新加载浏览器,一切正常。我相信 cookie 不是第一次创建的,而是在强制重新加载后创建的。
显然,每次刷新浏览器都是不可接受的解决方案。
需要做什么才能在不重新加载的情况下完成这项工作?
提前感谢您的任何指点。
【问题讨论】:
标签:
angularjs
single-sign-on
shibboleth
【解决方案1】:
我自己正在处理这个问题。我不相信 Shibboleth IDP 中有任何 CORS 支持,我要采用的解决方案是来自客户端的主动保活 ping:
- 定期向 Shibboleth 身份验证会话下的某个位置发出 Ajax 请求,以防止会话超时(例如使用 setTimeout)
- 如果这个请求失败,抛出一个整页错误提示用户用something like this重新加载页面
只要浏览器选项卡打开并且客户端机器处于唤醒状态,这将至少在session "lifetime" 内防止此类 XHR 错误:
lifetime(以秒为单位的时间)(默认为 28800)
SP 维护的会话有效的最大持续时间(以秒为单位)。实际时间可能小于此值(如果 IdP 指示它应该更短),但永远不会更长。请注意,这不会影响应用程序维护的会话。
如果客户端机器进入睡眠状态并且错过了足够多的 ping,或者如果 SP 的会话存储被清除,他们将立即收到全屏错误并重新加载以重新验证或重新建立他们的 Shibboleth 会话。
我认为这是我们在 IDP 中没有 CORS 所能做的最好的事情!
这是最终为我工作的 Apache 配置,以防其他人登陆这里:
RewriteEngine On
<Location />
AuthType Shibboleth
ShibUseHeaders On
ShibRequireSession On
Require valid-user
AuthGroupFile /etc/httpd/groups
</Location>
RewriteCond "%{LA-F:REMOTE_USER}" =""
RewriteRule ^/session-ping$ /yoursessiondoesnotexist [PT,L]
<Location /yoursessiondoesnotexist>
AuthType None
Require all granted
</Location>
RewriteCond "%{LA-F:REMOTE_USER}" !=""
RewriteRule ^/session-ping$ /ok.html [PT,L]
Alias /ok.html /var/www/ok.html
SetEnvIf Request_URI "^/session-ping$" DONTLOG
CustomLog /dev/stdout ncgl env=!DONTLOG
我每五秒使用 XHR 轮询一次 /session-ping,并在收到非 200 状态代码时抛出我的“你的会话已过期”模式/调光器。