采用OAuth 2提供CARSI身份认证功能,CARSI IdP通过OAuth 2接口与学校身份认证系统对接。IdP自动安装脚本已经完成基本配置,与学校部署情况相关、需要修改的部分如下。
1.修改OAuth 2对接参数
注意:
- 下面各配置参数中shibcarsi.serverName,请根据学校IdP域名进行配置。
- shibcarsi.oauth.oauth2UrlPrefix、shibcarsi.oauth.oauth2clientid、shibcarsi.oauth.oauth2clientsecret、shibcarsi.oauth.oauth2LoginUrl、shibcarsi.oauth.oauth2TokenUrl、shibcarsi.oauth.oauth2ResourceUrl 这些参数由Oauth2服务器管理员提供,请向其咨询。
- 下面shibcarsi.oauth.uidKey = uid 配置项中,请使用oauth2服务器中表示为用户名的那个字段代替uid,具体名称请咨询学校Oauth2认证系统管理员。
- 如果学校的Oauth返回的Token不在第一层, 则需要增加参数 shibcarsi.oauth.tokenKey = data/access_token,但具体参数的值需要根据学校的Oauth数据进行配置。
[carsi@www ~]$ sudo vi /opt/shibboleth-idp/conf/authn/authn.properties #修改第102行配置,修改external.jsp为/Authn/External idp.authn.External.externalAuthnPath = contextRelative:/Authn/External #新增以下内容: idp.authn.flows = External #设置IdP的域名,请使用学校IdP域名替代xxx.xxx.xxx.xxx shibcarsi.serverName = https://xxx.xxx.xxx.xxx #OAuth2服务器域名、clientid、secret shibcarsi.oauth.oauth2UrlPrefix = http://xxx.xxx.xxx.xxx shibcarsi.oauth.oauth2clientid = xxxxxxx shibcarsi.oauth.oauth2clientsecret = xxxxxxx #OAuth2认证页面以及需要传递的参数 shibcarsi.oauth.oauth2LoginUrl = ${shibcarsi.oauth.oauth2UrlPrefix}/authorize.php?response_type=code&client_id=${shibcarsi.oauth.oauth2clientid}&state=xyz # OAuth2用code获取token的URL shibcarsi.oauth.oauth2TokenUrl = ${shibcarsi.oauth.oauth2UrlPrefix}/token.php # OAuth2用token获取资源的URL shibcarsi.oauth.oauth2ResourceUrl = ${shibcarsi.oauth.oauth2UrlPrefix}/resource.php # oauth 释放属性中,作为用户名输入的那个字段。这个字段必须存在,不然会报错,具体名称请咨询学校Oauth2认证系统管理员 shibcarsi.oauth.uidKey = uid
2.配置属性定义
eduPersonScopedAffiliation属性,取值为用户在学校的身份,其中的“userType”为Oauth2中确定用户身份的属性名称,请替换成实际使用的属性名。关于身份属性取值,需要将Oauth2用户身份的取值,对应到CARSI联盟标准取值,包括:faculty(教师),student(学生),staff(教工),employee(雇员),member(各类人员,包括faculty、student、staff、employee),alum(校友),affiliate(附属人员或临聘,常用),other(CARSI补充,不建议优先使用)。下文样例,将所有的本地用户区分为“staff”、“student”、“member”三种身份。学校可根据实际部署情况选取其中的一部分值。不同SP对用户身份的要求不同,建议配置时尽可能细化用户身份分类,避免后期修改配置。
注:需要修改下述principalAttributeName="usertype"属性定义,principalAttributeName的取值应为Oauth2服务器用于定义用户身份的字段,下面的配置文件以usertype为例,请根据Oauth2服务器实际配置进行修改。 除了身份属性定义外,其他部分不需要修改。如果用户身份属性不在返回的json第一层,则需要根据返回属性的具体情况进行配置。
[carsi@www ~]$ sudo vi /opt/shibboleth-idp/conf/attribute-resolver.xml <AttributeDefinition xsi:type="ScriptedAttribute" id="eduPersonScopedAffiliation"> <InputAttributeDefinition ref="employeeType" /> <Script><![CDATA[ scopedValueType = Java.type("net.shibboleth.idp.attribute.ScopedStringAttributeValue"); var localPart = ""; if(typeof(employeeType)=="undefined"){ localPart = "other"; }else{ if(employeeType.getValues().get(0)=="staff") localPart = "staff"; # if条件中“staff”为本地用户管理系统中属性取值,可能是“staf”或其他 else if(employeeType.getValues().get(0).indexOf("student")!=-1) localPart = "student"; # if条件中“student”为本地用户管理系统中属性取值,可能是“stu”或其他 else if(employeeType.getValues().get(0).indexOf("faculty")!=-1) localPart = "faculty"; # if条件中“faculty”为本地用户管理系统中属性取值,可能是“faculty”或其他 else localPart = "member"; } eduPersonScopedAffiliation.addValue(new scopedValueType(localPart, "%{idp.scope}")); ]]></Script> </AttributeDefinition> <AttributeDefinition id="employeeType" xsi:type="SubjectDerivedAttribute" principalAttributeName="usertype"></AttributeDefinition> [carsi@www ~]$ sudo systemctl restart jetty
3. 某学校属性配置文件样本
在下面的属性配置文件中,在下面的属性配置文件中,principalAttributeName="userType",其中userType是IdP从认证源服务器拿到的用户属性字段名称,该字段用于区别用户身份,请咨询认证源服务器管理员并获得该字段名称。
[carsi@www ~]$ sudo cat attribute-resolver.xml <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 xsi:type="ScriptedAttribute" id="eduPersonScopedAffiliation"> <InputAttributeDefinition ref="employeeType" /> <Script><![CDATA[ scopedValueType = Java.type("net.shibboleth.idp.attribute.ScopedStringAttributeValue"); var localPart = ""; if(typeof(employeeType)=="undefined"){ localPart = "member"; }else{ if(employeeType.getValues().get(0)=="staff") localPart = "staff"; else if(employeeType.getValues().get(0).indexOf("student")!=-1) localPart = "student"; else if(employeeType.getValues().get(0).indexOf("faculty")!=-1) localPart = "faculty"; else localPart = "member"; } eduPersonScopedAffiliation.addValue(new scopedValueType(localPart, "%{idp.scope}")); ]]></Script> </AttributeDefinition> <AttributeDefinition id="employeeType" xsi:type="SubjectDerivedAttribute" principalAttributeName="userType"></AttributeDefinition> <AttributeDefinition id="eduPersonTargetedID" xsi:type="SAML2NameID" nameIdFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"> <InputDataConnector ref="myStoredID" attributeNames="persistentID"/> <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> <AttributeDefinition xsi:type="Scoped" id="eduPersonPrincipalName" scope="%{idp.scope}"> <InputAttributeDefinition ref="uid"/> </AttributeDefinition> <AttributeDefinition id="uid" xsi:type="PrincipalName" /> <AttributeDefinition id="eduPersonEntitlement" xsi:type="Simple"> <InputDataConnector ref="staticAttributes" attributeNames="eduPersonEntitlement" /> </AttributeDefinition> <DataConnector id="staticAttributes" xsi:type="Static"> <Attribute id="eduPersonEntitlement"> <Value>urn:mace:dir:entitlement:common-lib-terms</Value> </Attribute> </DataConnector> <AttributeDefinition id="samlPairwiseID" xsi:type="Scoped" scope="%{idp.scope}"> <InputDataConnector ref="myStoredID" attributeNames="persistentID"/> </AttributeDefinition> <DataConnector id="myStoredID" xsi:type="StoredId" generatedAttributeID="persistentID" salt="%{idp.persistentId.salt}" queryTimeout="0"> <InputAttributeDefinition ref="eduPersonPrincipalName"/> <BeanManagedConnection>MyDataSource</BeanManagedConnection> </DataConnector> </AttributeResolver>
4. 配置属性释放
IdP安装脚本已经完成属性释放配置,可不修改。