我们目前有一个保护特定路径的shibboleth实现。但是,因为此路径实际上是HTTP请求(使用$ http使用AngularJS应用程序创建),shibboleth将尝试将此请求“重定向”到身份提供程序,但浏览器只是将其解释为死请求。它返回到AngularJS,状态= -1,没有相关的标题/数据。
我想拦截这个302,而是返回401,最好能够编辑响应头。有没有办法使用Apache或Shibboleth来做到这一点?
相关区块:
# Proxy all requests to WebLogic
<Location "/api">
SetHandler weblogic-handler
WLSRequest On
WebLogicHost services.endpoint.com
WebLogicPort 9002
</Location>
# For requests marked as protected, apply shibboleth
# If this block gets triggered, Shibboleth attempts redirect
# which does not work with our architecture
<Location "/api/protected">
AuthType Shibboleth
ShibRequireSession On
ShibApplicationId default
ShibExportAssertion On
Require Shibboleth
</Location>
如何在AngularJS中使用它:
//API call to unprotected endpoint
$http.get('http://hosted.on.apache.com/api/getData');
//API call to protected endpoint - Shibboleth triggered
$http.get('http://hosted.on.apache.com/api/protected/getSecureData');
答案 0 :(得分:0)
我对Sibboleth并不熟悉,但正如人们在评论中指出的那样,可以通过反向代理轻松完成。
请参阅本答复中建议的解决方案作为参考:
答案 1 :(得分:0)
我认为没有必要将302重定向到404。 尝试添加以下的/ api / protected区域。
ShibRequestSetting requireSession 1
根据此处的文档,这是典型的受保护路径。 https://docs.shib.ncsu.edu/docs/testing/index.html
<Location /api/protected>
AuthType shibboleth
ShibCompatWith24 On
ShibRequestSetting requireSession 1
require shib-session
</Location>
答案 2 :(得分:0)
这似乎是不可能的,因为Shibboleth发送的302重定向仅由Apache转发给调用者(因为这不是错误)。
我通过解析/Shibboleth.sso/Session
来分析用户的登录状态来解决此用例,只要没有有效的会话,就永远不会触发对受保护资源的AJAX REST请求。
在这种情况下,我改为向用户提供一个登录按钮/链接。这将在服务器端通过其IDP登录过程将其重定向。完成后,/ login URL将通过Apache位置配置循环回到引用URL。
在Apache中
# This endpoint is to be requested with a query param "loopback"
# e.g. <a href="/login?loopback=[self]">
<Location /login>
# Let Shibboleth handle the creation of a valid session
AuthType shibboleth
ShibRequireSession On
ShibUseHeaders On
require valid-user
# The below section will not be reached until there is a valid session
# Read the loopback param that was appended in the original /login request
# and kept by Shibboleth through the IDP login procedure
RewriteCond %{QUERY_STRING} ^loopback=(.*)$
# ? after %1 removes the loopback query param
# Without ?, the redirect will be <loopback-url>?loopback=<loopback-url>
RewriteRule ^(.*)$ %1? [R=302,L]
</Location>