IdP认证对接及属性定义(CAS)(ova第3/6步,手动第3/9步)

        本文档介绍了采用CARSI IdP标准安装包对接CAS认证和属性定义的配置步骤,适用于本地采用CAS认证的情况。下一步:配置eduPersonTargetedID属性定义

(1)环境配置:

        下载相关附件(idp3cas.zip

新建/opt/shibboleth-idp/flows/authn/Shibcas/文件夹。

        将shibcas-authn-beans.xml和shibcas-authn-flow.xml拷贝至IdP服务器的/opt/shibboleth-idp/flows/authn/Shibcas/下。

        将no-conversation-state.jsp文件拷贝至IdP服务器的/opt/shibboleth-idp/edit-webapp/下。

        将文件cas-client-core-3.4.1.jar和shib-cas-authenticator-3.2.3.jar拷贝至IdP服务器的/opt/shibboleth-idp/edit-webapp/WEB-INF/lib/下。

(2)配置web.xml:

[root@www ~]# cp /opt/shibboleth-idp/dist/webapp/WEB-INF/web.xml /opt/shibboleth-idp/edit-webapp/WEB-INF/web.xml
[root@www ~]# vi /opt/shibboleth-idp/edit-webapp/WEB-INF/web.xml

#在<!-- Servlets and servlet mappings -->后加上(即为支持CAS加一组servlet和servlet-mapping,已有的还保留):

     <!-- Servlet for receiving a callback from an external CAS Server and continues the IdP login flow -->
     <servlet>
         <servlet-name>ShibCas Auth Servlet</servlet-name>
         <servlet-class>net.unicon.idp.externalauth.ShibcasAuthServlet</servlet-class>
         <load-on-startup>2</load-on-startup>
     </servlet>
     <servlet-mapping>
         <servlet-name>ShibCas Auth Servlet</servlet-name>
         <url-pattern>/Authn/ExtCas/*</url-pattern>
     </servlet-mapping>

(3)配置idp.properties(修改后,在部署的时候请把后面的注释全部删掉,连空格都不要留!!!):

[root@www ~]# vi /opt/shibboleth-idp/conf/idp.properties
#修改
idp.authn.flows = Shibcas

#新增
shibcas.casServerUrlPrefix = https://xxx.xxx.xxx.xxx/cas
#CAS服务器域名
shibcas.casServerLoginUrl = ${shibcas.casServerUrlPrefix}/login
shibcas.serverName = https://xxx.xxx.xxx.xxx
#IdP的域名  

# cas 的协议,如不配置则默认取 cas3.0 如果 cas 只支持 2.0 则取消该条注释修改为 cas20
# shibcas.ticketValidatorName = cas30

(4)配置general-authn.xml:

[root@www ~]# vi /opt/shibboleth-idp/conf/authn/general-authn.xml
#在<util:list id="shibboleth.AvailableAuthenticationFlows">后新增:

<bean id="authn/Shibcas" parent="shibboleth.AuthenticationFlow"
                 p:passiveAuthenticationSupported="true"
                 p:forcedAuthenticationSupported="true"
                 p:nonBrowserSupported="false" />

(5)配置属性释放,用以下内容替换/opt/shibboleth-idp/conf/attribute-resolver.xml文件(但须修改salt="xxxxxxxxxxxxxxxxxxxx" 的值为自己生成的盐值,可使用命令生成:openssl rand 32 -base64):

<?xml version="1.0" encoding="UTF-8"?>
<AttributeResolver
        xmlns="urn:mace:shibboleth:2.0:resolver"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd">

    <AttributeDefinition id="eduPersonScopedAffiliation" xsi:type="Scoped" scope="%{idp.scope}">
        <InputAttributeDefinition ref="employeetype" />
        <AttributeEncoder xsi:type="SAML1ScopedString" name="urn:mace:dir:attribute-def:eduPersonScopedAffiliation" encodeType="false" />
        <AttributeEncoder xsi:type="SAML2ScopedString" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" friendlyName="eduPersonScopedAffiliation" encodeType="false" />
    </AttributeDefinition>
    <AttributeDefinition xsi:type="SubjectDerivedAttribute" id="employeetype" principalAttributeName="affiliation"></AttributeDefinition>

    <AttributeDefinition id="eduPersonPrincipalName" xsi:type="Scoped" scope="%{idp.scope}">
        <InputAttributeDefinition ref="employeename" />
        <AttributeEncoder xsi:type="SAML1ScopedString" name="urn:mace:dir:attribute-def:eduPersonPrincipalName" encodeType="false" />
        <AttributeEncoder xsi:type="SAML2ScopedString" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" friendlyName="eduPersonPrincipalName" encodeType="false" />
    </AttributeDefinition>
    <AttributeDefinition xsi:type="SubjectDerivedAttribute" id="employeename" principalAttributeName="eppn"></AttributeDefinition>

    <AttributeDefinition id="eduPersonTargetedID" xsi:type="SAML2NameID" nameIdFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">
        <InputDataConnector ref="ComputedIDConnector" attributeNames="computedID"/>
        <AttributeEncoder xsi:type="SAML1XMLObject" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" encodeType="false"/>
        <AttributeEncoder xsi:type="SAML2XMLObject" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" friendlyName="eduPersonTargetedID" encodeType="false"/>
    </AttributeDefinition> 
    <DataConnector id="ComputedIDConnector" xsi:type="ComputedId" generatedAttributeID="computedID" salt="xxxxxxxxxxxxxxxxxxxx" encoding="BASE64">
        <InputAttributeDefinition ref="eduPersonPrincipalName" />
    </DataConnector>

    <AttributeDefinition id="eduPersonEntitlement" xsi:type="Simple">
        <InputDataConnector ref="staticAttributes" attributeNames="eduPersonEntitlement" />
        <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:eduPersonEntitlement" encodeType="false"/>
        <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" friendlyName="eduPersonEntitlement" encodeType="false"/>
    </AttributeDefinition>
    <DataConnector id="staticAttributes" xsi:type="Static">
        <Attribute id="eduPersonEntitlement">
        <Value>urn:mace:dir:entitlement:common-lib-terms</Value>
        </Attribute>
    </DataConnector>

</AttributeResolver>

        说明:

  • 原理:affiliation为CAS直接释放的属性,其值为文本类型(faculty, student, staff, alum, member, affiliate, employee, other之一)。这里的配置是先取得它的值(存入employeetype属性),再在其上通过Scoped的属性加上学校域名的后缀,最终由id为eduPersonScopedAffiliation的属性释放。eduPersonPrincipalName属性同理进行了配置。
  • 学校通常需要做的调整:principalAttributeName为CAS系统释放出来的属性名,上例中为affiliation,请根据学校CAS的实际情况调整,具体请咨询学校CAS负责人。


        但往往CAS返回的代表身份的字段,取值不是正好的文本类型(faculty, student, staff, alum, member, affiliate, employee, other之一),可以参考如下的脚本进行映射(替换上面attribute-resolver.xml中的相关部分):这里首先判断CAS是否返回了affiliation字段(没返回的话就是"undefined",则将其值设置为固定的“other”),若返回了这个字段,但其值是"staf"或"std"这样的字符串,这段脚本可以将其值映射为"staff"或"student",并在其后加上了学校域名。该字段具体的取值范围请参考IdP属性介绍,请咨询学校CAS负责人进行具体的取值应设。

    <AttributeDefinition xsi:type="ScriptedAttribute" id="eduPersonScopedAffiliation">
        <InputAttributeDefinition ref="employeetype" />
        <Script><![CDATA[
        var localpart = "";
        if(typeof(employeetype)=="undefined"){
            localpart = "member";
        }else{
            if(employeetype.getValues().get(0)=="staf") localpart = "staff";
            else if(employeetype.getValues().get(0)=="std") localpart = "student";
            else localpart = "member";
        }
        eduPersonScopedAffiliation.addValue(localpart + "@%{idp.scope}");
            ]]></Script>
        <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:eduPersonScopedAffiliation" encodeType="false" />
        <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" friendlyName="eduPersonScopedAffiliation" encodeType="false" />
    </AttributeDefinition>
    <AttributeDefinition xsi:type="SubjectDerivedAttribute" id="employeetype" principalAttributeName="affiliation"></AttributeDefinition>

(5)重新编译war文件,并且重启tomcat:

[root@www ~]# chown -R tomcat.tomcat /opt/shibboleth-idp
[root@www ~]# cd /opt/shibboleth-idp/bin
[root@www ~]# ./build.sh

Installation Directory: [/opt/shibboleth-idp] #enter

Rebuilding /opt/shibboleth-idp/war/idp.war ...

...done

BUILD SUCCESSFUL

Total time: 3 seconds

[root@www ~]# systemctl restart tomcat

备注:关于CAS服务器端配置

        此处配置仅做参考,具体配置请咨询学校CAS负责人。以CAS 6.0.x版本对接LDAP为例。参考官方文档配置、安装CAS服务器。须配置application.properties文件(以不使用ssl为例,须根据学校具体配置进行相应调整各属性):

cas.authn.ldap[0].type=AUTHENTICATED
cas.authn.ldap[0].ldapUrl=ldap://xx.xx.xx.xx:389
cas.authn.ldap[0].useSsl=false
cas.authn.ldap[0].baseDn=ou=People,dc=pku,dc=edu
cas.authn.ldap[0].searchFilter=uid={user}
cas.authn.ldap[0].bindDn=cn=Manager,dc=pku,dc=edu
cas.authn.ldap[0].bindCredential=xxxxxxxx
cas.authn.ldap[0].principalAttributeList=employeeType:affiliation,uid:eppn
cas.authn.attributeRepository.defaultAttributesToRelease=affiliation,eppn

        这里的环境,代表用户身份的字段为employeeType,最后两行的配置是将其作为affiliation属性释放给IdP。eppn同理进行了配置。可根据学校具体配置进行相应调整。


========附录========

1. 如果您调试了很久依然起不起来idp,可以参考北京大学基于以上配置生成的/opt/shibboleth-idp 路径,将您的环境与这个环境的文件做一下diff,这套环境理论上可以工作,应该仅需根据贵校的情况调整attribute-resolver.xml。(principalAttributeName为CAS系统释放出来的属性名,根据学校情况调整,具体请咨询学校CAS负责人;eduPersonScopedAffiliation属性,因北大的测试CAS直接出来的值就是类似staff、student这样的字符串了,如果您的环境不一样,可以看下下面浙大老师的文档作相应调整) shibboleth-idp-idpzl.zip

2. 浙江大学CARSI IdP + CAS部署实践(浙江大学信息技术中心,单康康):浙江大学CARSI IdP + CAS部署实践(浙江大学信息技术中心,单康康,20200205).docx

3. 本文所用的cas插件默认采用 cas3.0 的协议,它的ticket校验接口是/cas/p3/serviceValidate,如果cas版本较低仅支持 2.0 协议,比如cas老版本可能用的ticket校验接口是cas/serviceValidate,此时需要在idp.properties配置文件中将shibcas.ticketValidatorName 设置为 cas20:

shibcas.ticketValidatorName = cas20

或者华东师范的冯骐老师介绍另了一种通用性的方案,可以尝试一下:在CAS侧做个反向代理,将这个接口代理一下,比如:

       

版权所有©北京大学计算中心