我有两个Web应用程序,Webapp A和webappB。WebappA是Spring 3.1 webapp。 Webapp B是独立的非Spring Webapp。两者均受CAS保护。我的目标是允许webapp A使用代理票证从webapp B检索信息。

为简化起见,我将spring-security提供的cas-sample用作webappA。配置为使用本地cas的默认示例按预期工作。对于不熟悉cas-sample的用户,它提供了一个示例,该示例使用代理票证在cas-sample应用程序中请求另一个页面。然后,我在一个由mod_auth_cas保护的apache网络服务器下的一个简单页面用于webappB。同样,webapp B可以正常工作。当我将cas-sample更改为使用代理票证请求webappB时,它不起作用。对webappB的请求的响应是CAS登录页面。注意:我已经尝试过使用webapp B的tomcat webapp(非spring),但结果相同。这使我相信问题不在于webappB。以下是用于使用代理票证向webapp B发出请求的代码。并且可以在here中查看安全上下文配置。

final String targetUrl = "https://server/webappB";
final CasAuthenticationToken token = (CasAuthenticationToken) request.getUserPrincipal();
final String proxyTicket = token.getAssertion().getPrincipal().getProxyTicketFor(targetUrl);
final String serviceUrl = targetUrl+"?ticket="+URLEncoder.encode(proxyTicket, "UTF-8");
String proxyResponse = CommonUtils.getResponseFromServer(serviceUrl, "UTF-8");


我究竟做错了什么?当上面的targetUrl在webapp A中但不在外部应用程序中时,为什么这可以工作?

谢谢你的帮助。

编辑:如果有帮助,这是对Webapp进行请求时在CAS日志中显示的内容使用代理凭单的页面。

[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Attempting to retrieve ticket [TGT-2-YX0RNVRDHAPyGLy6ymGGVucUSQyjtre4jvGrAxYk2hXsehsxqx-cas]
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Ticket [TGT-2-YX0RNVRDHAPyGLy6ymGGVucUSQyjtre4jvGrAxYk2hXsehsxqx-cas] found in registry.
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Added ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas] to registry.
[org.jasig.cas.CentralAuthenticationServiceImpl] - Granted proxy ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas] for service [https://server/webappB] for user [testUser]
[org.jasig.cas.web.support.CasArgumentExtractor] - Extractor generated service for: https://server/webappB
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Attempting to retrieve ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas]
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas] found in registry.
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Removing ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas] from registry
[org.jasig.cas.web.support.CasArgumentExtractor] - Extractor generated service for: https://server/webappB
[org.jasig.cas.web.flow.InitialFlowSetupAction] - Placing service in FlowScope: https://server/webappB
[org.jasig.cas.web.flow.InitialFlowSetupAction] - Placing service in FlowScope: https://server/webappB
[org.jasig.cas.web.support.CasArgumentExtractor] - Extractor generated service for: https://server/webappB

最佳答案

我终于想通了。我错了,问题确实出在webapp B上。显然mod_auth_cas不支持代理身份验证。我使用备用Web应用程序B(这是一个带有tomcat的简单Java Web应用程序)获得了理想的结果。该webapp使用的是web.xml中定义的CAS过滤器。最初不起作用的原因是validateUrl参数未设置为proxyValidate且未设置authorizedProxy参数。正确设置这些参数后,webapp B可以接受代理票证。最终的过滤器配置如下所示:

   <filter>
     <filter-name>CAS Filter</filter-name>
     <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
     <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
         <param-value>https://cas.server:9443/cas/login</param-value>
     </init-param>
     <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
         <param-value>https://cas.server:9443/cas/proxyValidate</param-value>
     </init-param>
     <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.authorizedProxy</param-name>
         <param-value>https://webappA:8443/cas-sample/j_spring_cas_security_proxyreceptor</param-value>
     </init-param>
     <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
         <param-value>webappB:7443</param-value>
     </init-param>
   </filter>

关于java - Spring和CAS使用代理凭单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8838545/

10-12 03:27