4、用企业微信接口对接

       CARSI IdP对接企业微信通讯录的方法:

1、在企业微信管理端,申请企业微信应用“CARSI资源共享”

        进入企业微信,应用管理,自建,选择创建应用“CARSI资源共享”(可见范围:必须选择根目录)。如果已经申请过应用,直接进入应用详情页面。

        创建完成后,进入应用详情,记录AgentId和Secret,后续IdP安装与配置需要用到这两个参数。

        进入我的企业,获取企业ID。后续IdP安装与配置需要用到这个参数。

2、在企业微信管理端,配置“CARSI资源共享”应用

        进入应用详情,功能,将工作台应用主页修改成https://dspre.carsi.edu.cn/Shibboleth.sso/Login?SAMLDS=1&target=https%3A%2F%2Fdspre.carsi.edu.cn%2Fwxds&entityID=https%3A%2F%2F{SERVERNAME}%2Fidp%2Fshibboleth,在预上线环境进行测试。

        注意:请将{SERVERNAME}替换成IdP域名,如idp.xxx.edu.cn

        进入应用详情,开发者接口,企业微信授权登录,授权回调域名改成IdP域名,例如idp.xxx.edu.cn

        进入应用详情,开发者接口,网页授权及JS-SDK,设置改成IdP域名,例如idp.xxx.edu.cn

3.在IdP端,配置企业微信对接参数

[root@www ~]# vi /opt/shibboleth-idp/conf/idp.properties
#修改
idp.authn.flows=External
#新增,将{APPID}替换成应用的secret,将{APPSECRET}替换成企业ID,将{AgentID}替换成应用的agentid,将{SERVERNAME}替换成idp的域名
shibcas.oauth2UrlPrefix = https://open.weixin.qq.com/connect/oauth2/authorize
shibcas.oauth2LoginUrl = ${shibcas.oauth2UrlPrefix}?appid={APPSECRET}&response_type=code&scope=snsapi_base&state=STATE
shibcas.oauth2LoginUrlh5 = https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid={APPSECRET}&agentid={AgentID}&state=STATE
shibcas.serverName = https://{SERVERNAME}
shibcas.oauth2TokenUrl = https://qyapi.weixin.qq.com/cgi-bin/gettoken
shibcas.oauth2ResourceUrl = https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo
shibcas.oauth2GetUserUrl = https://qyapi.weixin.qq.com/cgi-bin/user/get
shibcas.oauth2clientid = {APPSECRET}
shibcas.oauth2clientsecret = {APPID}
shibcas.oauth2redirecturi = https%3a%2f%2f{SERVERNAME}%2fidp%2fAuthn%2fExternal%3fconversation%3de1s1
shibcas.getdepartmentUrl = https://qyapi.weixin.qq.com/cgi-bin/department/list

4.在IdP端,配置属性定义

        eduPersonScopedAffiliation属性,取值为用户在学校的身份,其中的“departmentname”为企业微信中确定用户身份的属性名称。关于身份属性取值,需要将企业微信中用户身份的取值,对应到CARSI联盟标准取值,包括:faculty(教师),student(学生),staff(教工),employee(雇员),member(各类人员,包括faculty、student、staff、employee),alum(校友),affiliate(附属人员或临聘,常用),other(CARSI补充,不建议优先使用)。下文样例,将所有的本地用户区分为“staff”、“student”、“member”三种身份。学校可根据本地LDAP实际部署情况选取其中的一部分值。不同SP对用户身份的要求不同,建议配置时尽可能细化用户身份分类,避免后期修改配置。

        默认获取了企业微信通讯录的部门信息作为用户身份判别的依据,请根据实际情况进行替换。例如某用户的部门为:学生/信息科学技术学院/大一,则可以用if(departmentname.getValues().get(0).indexOf("学生")!=-1) localpart = "student";来将改用户映射成student。

        注:为了能获取到用户的完整部门信息,请授权创建的企业微信应用有访问根目录的权限

        注:只需要修改下述eduPersonScopedAffiliation属性定义即可,其他内容不需要修改

[root@www ~]# sudo vi /opt/shibboleth-idp/conf/attribute-resolver.xml
    <AttributeDefinition xsi:type="ScriptedAttribute" id="eduPersonScopedAffiliation">
        <Dependency ref="departmentname" />
        <Script><![CDATA[
        var localpart = "";
        if(typeof(departmentname)=="undefined"){
            localpart = "member";
        }else{
            if(departmentname.getValues().get(0).indexOf("本科生")!=-1) localpart = "student";
            else if(departmentname.getValues().get(0).indexOf("研究生")!=-1) localpart = "student";
            else if(departmentname.getValues().get(0).indexOf("留学生")!=-1) localpart = "student";
            else if(departmentname.getValues().get(0).indexOf("教职工")!=-1) localpart = "staff";
            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="departmentname" principalAttributeName="departmentname"></AttributeDefinition>
[root@www ~]# sudo systemctl restart tomcat9

        eduPersonTargtedID是一个永久可用的用户唯一id。通过hash算法加密之后,可读性不强。适用于需要区分不同用户的应用场景,同时保护了用户个人隐私。       

        修改eduPersonTargtedID加密盐值,可以使用如下指令生成随机字符串,并将idp.persistentId.salt = xxxxxxxxxxxxxxxxxxxx中的xxxxxxxxxxxxxxxxxxxx修改成生成的随机字符串

        注意:如果是进行IdP的升级,为了保证生成的eduPersonTargtedID一致,请沿用旧IdP的加密盐值,旧的加密盐值请参考IdP3.4.7备份恢复及高可用方案

[root@www ~]# openssl rand -base64 32
aesqnxtO+Di26xM78kXY6yD2m0QCK+0p68i7j7jQL8k=
[root@www ~]# vi /opt/shibboleth-idp/conf/saml-nameid.properties
idp.persistentId.sourceAttribute = eduPersonPrincipalName
idp.persistentId.salt = xxxxxxxxxxxxxxxxxxxx
idp.persistentId.encoding = BASE64
idp.persistentId.dataSource = MyDataSource

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