wsfederation 中的 CAS 属性未转发到 CAS 客户端

CAS attributes in wsfederation not being forwarded to CAS client

我正在为 Tomcat Web 应用程序实施身份验证系统,该系统使用 CAS 针对 ADFS 进行身份验证。我正在使用 unicon 的 CAS server with ADFS integration.

我已经达到可以看到所需属性到达 CAS 服务器的状态。但是这些属性没有被转发给客户端。检查下图:

上图中,认证后属性图为空。此外,当客户端应用程序验证票证时,属性映射为空。参考图片如下:

通过身份验证后,属性在日志中可见,但不会加载到属性映射中。

deployerConfigContext.xml如下。 serviceRegistryDao bean 中的 attributeRepository bean 和允许的属性 属性 可能是主要关注领域。

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:sec="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <bean id="authenticationManager"
        class="org.jasig.cas.authentication.AuthenticationManagerImpl">

        <property name="authenticationMetaDataPopulators">
           <list>
              <bean class="net.unicon.cas.support.wsfederation.authentication.WsFederationAuthenticationMetaDataPopulator" />
           </list>
        </property>
        <property name="credentialsToPrincipalResolvers">
            <list>
            <bean class="net.unicon.cas.support.wsfederation.authentication.principal.WsFederationCredentialsToPrincipalResolver">
                <property name="configuration" ref="wsFedConfig" />
            </bean>
            <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" >
                <property name="attributeRepository" ref="attributeRepository" />
            </bean>
            <bean       class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
            </list>         
        </property>

        <property name="authenticationHandlers">
            <list>
            <bean class="net.unicon.cas.support.wsfederation.authentication.handler.support.WsFederationAuthenticationHandler" />
            <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
                p:httpClient-ref="httpClient" />
            </list>
        </property>
    </bean>

    <sec:user-service id="userDetailsService">
        <sec:user name="@@THIS SHOULD BE REPLACED@@" password="notused" authorities="ROLE_ADMIN" />
    </sec:user-service>

    <bean id="attributeRepository"
        class="org.jasig.services.persondir.support.StubPersonAttributeDao">
        <property name="backingMap">
            <map>
                <entry key="emailaddress" value="upn" />
                <!--<entry key="FirstName" value="username" />-->
                <entry key="name" value="LastName" />
                <entry key="costcent" value="costcent" />
                <entry key="title" value="FirstName" />
            </map>
        </property>
    </bean>

    <bean
        id="serviceRegistryDao"
        class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
            <property name="registeredServices">
                <list>
                    <bean class="org.jasig.cas.services.RegexRegisteredService">
                        <property name="id" value="0" />
                        <property name="name" value="HTTP and IMAP" />
                        <property name="description" value="Allows HTTP(S) and IMAP(S) protocols" />
                        <property name="serviceId" value="^(https?|imaps?)://.*" />
                        <property name="evaluationOrder" value="10000001" />
                        <property name="allowedAttributes">
                        <list>
            <value>upn</value>
            <value>Department</value>
            <value>costcent</value>
            <value>LastName</value>
            <value>FirstName</value>
            <value>name</value>
            <value>emailaddress</value>
            <value>title</value>
            <value>SAM-Account-Name</value>

                        </list>
                    </property>
                    </bean>

                </list>
            </property>
        </bean>

  <bean id="auditTrailManager" class="com.github.inspektr.audit.support.Slf4jLoggingAuditTrailManager" />

  <bean id="healthCheckMonitor" class="org.jasig.cas.monitor.HealthCheckMonitor">
    <property name="monitors">
      <list>
        <bean class="org.jasig.cas.monitor.MemoryMonitor"
            p:freeMemoryWarnThreshold="10" />
        <bean class="org.jasig.cas.monitor.SessionMonitor"
            p:ticketRegistry-ref="ticketRegistry"
            p:serviceTicketCountWarnThreshold="5000"
            p:sessionCountWarnThreshold="100000" />
      </list>
    </property>
  </bean>
</beans>

CAS 服务器的其余部分与 unicon 的 CAS 服务器实现的示例实现相同 here

我在提到的 bean 中尝试了很多组合。作为 Spring 的新手,我无法理解如何在 attributeMap 中加载凭据。请指导我将认证期间CAS服务器发送的属性转发给客户端应用程序。

看起来 WsFederationCredentialsToPrincipalResolver 只从收到的属性集合中提取主体 ID,而忽略其他属性。因此,您只能获得配置中定义的身份属性。您暂时可以将该解析器连接到您的属性存储库,并让它使用并从那里检索属性。

请注意,CAS 4.2 支持并修复了此行为,并且内置了对 ADFS 集成的支持。您的另一个选择是扩展 WsFederationCredentialsToPrincipalResolver 并让它处理属性并将它们填充到通过覆盖适当的方法在那里创建的最终主体中。