使用Apache捕获302并返回401

时间:2016-06-30 23:55:31

标签: angularjs ajax apache http shibboleth

我们目前有一个保护特定路径的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');

3 个答案:

答案 0 :(得分:0)

我对Sibboleth并不熟悉,但正如人们在评论中指出的那样,可以通过反向代理轻松完成。

请参阅本答复中建议的解决方案作为参考:

Apache - Reverse Proxy and HTTP 302 status message

答案 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>