Shibboleth与云SSO进行单点登录的示例
本文为您提供Shibboleth与云SSO进行单点登录(SSO登录)的示例。
准备工作
安装Shibboleth、Tomcat和LDAP Server。
本文中涉及的Shibboleth配置部分属于建议,仅用于帮助理解阿里云SSO登录的端到端配置流程,阿里云不提供Shibboleth配置的咨询服务。
步骤一:在阿里云获取SAML服务提供商元数据
登录云SSO控制台。
在左侧导航栏,单击设置。
在SSO登录区域,下载服务提供商(SP)元数据文件,并另存到
/opt/shibboleth-idp/metadata/aliyun-cloudsso-metadata.xml
。同时,保存服务提供商(SP)的
Entity ID
,以便在后续配置中使用。
步骤二:将阿里云注册到Shibboleth
配置/opt/shibboleth-idp/conf/metadata-providers.xml
,指定步骤一:在阿里云获取SAML服务提供商元数据获取的元数据文件,将阿里云注册到Shibboleth。
<!--
<MetadataProvider id="LocalMetadata" xsi:type="FilesystemMetadataProvider" metadataFile="PATH_TO_YOUR_METADATA"/>
-->
<!-- 找到上方注释代码,替换为下方代码 -->
<MetadataProvider id="AliyunMetadata" xsi:type="FilesystemMetadataProvider" metadataFile="%{idp.home}/metadata/aliyun-cloudsso-metadata.xml"/>
步骤三:配置Shibboleth返回的用户属性
修改
/opt/shibboleth/conf/services.xml
。原版使用的是
attribute-resolver.xml
配置文件,包含的配置信息不够,需要启动完整版的配置,将其替换为attribute-resolver-full.xml
。<value>%{idp.home}/conf/attribute-resolver.xml</value> <!-- 找到上方代码,替换为下方代码 --> <value>%{idp.home}/conf/attribute-resolver-full.xml</value>
修改
/opt/shibboleth/conf/attribute-resolver-full.xml
。在该文件中配置用户信息中返回的属性。本示例中选择
mail
字段作为返回属性。<!-- ========================================== --> <!-- Attribute Definitions --> <!-- ========================================== --> <!-- Schema: Core schema attributes--> <!-- 找到上方注释代码,在后面加入下方代码 --> <AttributeDefinition xsi:type="Simple" id="mail"> <InputDataConnector ref="myLDAP" attributeNames="mail" /> <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:mail" encodeType="false" /> <AttributeEncoder xsi:type="SAML2String" name="urn:oid:0.9.2342.19200300.100.1.3" friendlyName="mail" encodeType="false" /> </AttributeDefinition>
在该文件中读取
/opt/shibboleth/conf/ldap.properties
中配置的信息,进行IDAP连接的创建。<!-- Example LDAP Connector --> <!-- <DataConnector id="myLDAP" xsi:type="LDAPDirectory" ldapURL="%{idp.attribute.resolver.LDAP.ldapURL}" baseDN="%{idp.attribute.resolver.LDAP.baseDN}" principal="%{idp.attribute.resolver.LDAP.bindDN}" principalCredential="%{idp.attribute.resolver.LDAP.bindDNCredential}" useStartTLS="%{idp.attribute.resolver.LDAP.useStartTLS:true}" ...省略... </DataConnector> --> <!-- 找到上方示例代码,将其替换为下方代码 --> <DataConnector id="myLDAP" xsi:type="LDAPDirectory" ldapURL="%{idp.attribute.resolver.LDAP.ldapURL}" baseDN="%{idp.attribute.resolver.LDAP.baseDN}" principal="%{idp.attribute.resolver.LDAP.bindDN}" principalCredential="%{idp.attribute.resolver.LDAP.bindDNCredential}" useStartTLS="%{idp.attribute.resolver.LDAP.useStartTLS}" connectTimeout="%{idp.attribute.resolver.LDAP.connectTimeout}" responseTimeout="%{idp.attribute.resolver.LDAP.responseTimeout}"> <FilterTemplate> <![CDATA[ %{idp.attribute.resolver.LDAP.searchFilter} ]]> </FilterTemplate> </DataConnector>
修改
/opt/shibboleth/conf/attribute-filter.xml
,添加属性过滤器。将
PolicyRequirementRule
标签中的value
属性替换为步骤一:在阿里云获取SAML服务提供商元数据中的阿里云entityID
。<AttributeFilterPolicyGroup id="ShibbolethFilterPolicy" xmlns="urn:mace:shibboleth:2.0:afp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mace:shibboleth:2.0:afp http://shibboleth.net/schema/idp/shibboleth-afp.xsd"> <!-- 找到上方代码,在后面加入下方代码 --> <AttributeFilterPolicy id="aliyun"> <PolicyRequirementRule xsi:type="Requester" value="[entityID]" /> <AttributeRule attributeID="mail"> <PermitValueRule xsi:type="ANY" /> </AttributeRule> </AttributeFilterPolicy>
步骤四:配置SAML响应的NameID
修改
/opt/shibboleth/conf/relying-party.xml
,为阿里云建立NameID的配置。将
bean
标签中的relyingPartyIds
属性替换为步骤一:在阿里云获取SAML服务提供商元数据中的阿里云entityID
。<!-- Override example that identifies a single RP by name and configures it for SAML 2 SSO without encryption. This is a common "vendor" scenario. --> <!-- <bean parent="RelyingPartyByName" c:relyingPartyIds="https://sp.example.org"> <property name="profileConfigurations"> <list> <bean parent="SAML2.SSO" p:encryptAssertions="false" /> </list> </property> </bean> --> <!-- 找到上方注释代码,替换为下方代码 --> <bean parent="RelyingPartyByName" c:relyingPartyIds="[entityID]"> <property name="profileConfigurations"> <list> <bean parent="SAML2.SSO" p:encryptAssertions="false" p:nameIDFormatPrecedence="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" /> </list> </property> </bean>
修改
/opt/shibboleth/conf/saml-nameid.xml
,配置NameID的生成方式。<!-- 找到下方两处代码,将其注释取消,使之生效 --> <bean parent="shibboleth.SAML2AttributeSourcedGenerator" p:omitQualifiers="true" p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" p:attributeSourceIds="#{ {'mail'} }" /> <bean parent="shibboleth.SAML1AttributeSourcedGenerator" p:omitQualifiers="true" p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" p:attributeSourceIds="#{ {'mail'} }" />
修改
/opt/shibboleth/conf/saml-nameid.properties
,配置NameID的相关属性。idp.nameid.saml2.default = urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress idp.persistentId.useUnfilteredAttributes = true idp.persistentId.encoding = BASE32
步骤五:在Shibboleth获取SAML IdP元数据
重启Tomcat,使前面的配置生效。
访问
https://<您的服务器地址>/idp/shibboleth
,将元数据文件保存到本地。
步骤六:在云SSO启用SSO登录
在云SSO的左侧导航栏,单击设置。
在SSO登录区域,单击配置身份提供商信息。
在配置身份提供商信息对话框,选择上传元数据文档。
单击上传文件,上传从步骤五:在Shibboleth获取SAML IdP元数据获取的IdP元数据文件。
打开SSO登录开关,启用SSO登录。
说明启用SSO登录后,用户名和密码登录将自动禁用,即云SSO用户将不能通过用户名和密码登录。而且,SSO登录是一个全局功能,启用后,所有用户都需要SSO登录。
步骤七:在云SSO创建用户
在云SSO创建与Shibboleth中的同名用户。
在云SSO的左侧导航栏,选择 。
在用户页面,单击创建用户。
在创建用户面板,输入用户名。
本示例中,用户名为
testUser@testdomain.alicloud.com
。设置用户状态为已启用。
单击关闭。
(可选)步骤八:为用户授权
如果您计划用户SSO登录后访问资源目录指定成员账号中的指定资源,您还需要创建访问配置,并为用户在RD账号上授权。
验证结果
完成上述配置后,您可以从阿里云或Shibboleth发起SSO登录。
从阿里云侧发起登录
在云SSO控制台的概览页,复制用户登录地址。
使用新的浏览器打开复制的用户登录地址。
单击跳转,系统会自动跳转到Shibboleth的登录页面。
在Shibboleth的登录界面,输入用户名(testUser)和密码,单击登录。
系统将自动SSO登录并重定向到云SSO用户门户。
访问RD账号中有权限的资源。
从Shibboleth侧发起登录
访问
https://<您的服务器地址>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>
。该链接中的
<entityID>
为步骤一:在阿里云获取SAML服务提供商元数据中的阿里云entityID
。在Shibboleth的登录界面,输入用户名(testUser)和密码,单击登录。
系统将自动SSO登录并重定向到云SSO用户门户。
访问RD账号中有权限的资源。
常见问题
结果验证时如果遇到问题,您可以查看/opt/shibboleth-idp/logs/idp-process.log
,通过日志分析问题原因。常见问题如下:
Shibboleth用户名密码正确,但是登录后提示异常。
查看/opt/shibboleth-idp/logs/idp-process.log
中的报错信息,如果是与ValidateUsernamePassword
错误有关,则重点检查IDAP的连接配置和部署情况,重点查看是否将注释去除,且不能输入多余空格。
登录后无响应,提示unable to connect to the ldap
。
检查ldap.properties
和attribute-resolver-full.xml
文件中IDAP连接的相关配置。
登录后转跳阿里云,提示The NameID is missing
。
检查步骤三:配置Shibboleth返回的用户属性中是否正确将用户信息中的mail
映射为属性,检查步骤四:配置SAML响应的NameID中NameID
配置是否正确。
访问https://<您的服务器地址>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>
时提示Unsupported Request
。
检查entityId
是否配置正确。metadata
文件夹下的元数据、attribute-filter.xml
和relying-party.xml
三处中的entityId
必须保持一致。
登录后转跳阿里云,提示The response signature is invalid
。
重新将Shibboleth的元数据文件上传到阿里云。