Spring和CAS使用代理票证

Jon*_*xon 2 java spring cas spring-security single-sign-on

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

为了简化操作,我将spring-security提供的cas-sample作为webapp A.配置为使用本地cas的默认样本按预期工作.对于那些不熟悉cas-sample的人,它提供了一个使用代理票据来请求cas-sample应用程序中的另一个页面的示例.然后我使用一个简单的页面在apache webserver下使用mod_auth_cas保护webapp B.同样,webapp B按预期工作.当我更改cas-sample以使用代理票据请求webappB时,它不起作用.来自webappB请求的响应是CAS登录页面.注意:我已经为webapp B尝试了一个tomcat webapp(非spring),结果相同.这让我相信问题不在webapp B中.下面是用于使用代理票证向webapp B发出请求的代码.并且可以在此处查看安全上下文配置.

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");
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?当上面的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
Run Code Online (Sandbox Code Playgroud)

Jon*_*xon 6

我终于想出了这一个.我错了,问题确实存在于webapp B中.显然,mod_auth_cas不支持代理身份验证.我能够通过我的备用webapp B(这是一个带有tomcat的简单Java webapp)获得所需的结果.此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>
Run Code Online (Sandbox Code Playgroud)