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侧做个反向代理,将这个接口代理一下,比如:
版权所有©北京大学计算中心