Shibboleth与云SSO进行单点登录的示例

更新时间:

本文为您提供Shibboleth与云SSO进行单点登录(SSO登录)的示例。

准备工作

安装Shibboleth、Tomcat和LDAP Server。

说明

本文中涉及的Shibboleth配置部分属于建议,仅用于帮助理解阿里云SSO登录的端到端配置流程,阿里云不提供Shibboleth配置的咨询服务。

步骤一:在阿里云获取SAML服务提供商元数据

  1. 登录云SSO控制台

  2. 在左侧导航栏,单击设置

  3. 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返回的用户属性

  1. 修改/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>
  2. 修改/opt/shibboleth/conf/attribute-resolver-full.xml

    1. 在该文件中配置用户信息中返回的属性。本示例中选择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>
    2. 在该文件中读取/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>
  3. 修改/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

  1. 修改/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>
  2. 修改/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'} }" />
  3. 修改/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元数据

  1. 重启Tomcat,使前面的配置生效。

  2. 访问https://<您的服务器地址>/idp/shibboleth,将元数据文件保存到本地。

步骤六:在云SSO启用SSO登录

  1. 在云SSO的左侧导航栏,单击设置

  2. SSO登录区域,单击配置身份提供商信息

  3. 配置身份提供商信息对话框,选择上传元数据文档

  4. 单击上传文件,上传从步骤五:在Shibboleth获取SAML IdP元数据获取的IdP元数据文件。

  5. 打开SSO登录开关,启用SSO登录。

    说明

    启用SSO登录后,用户名和密码登录将自动禁用,即云SSO用户将不能通过用户名和密码登录。而且,SSO登录是一个全局功能,启用后,所有用户都需要SSO登录。

步骤七:在云SSO创建用户

在云SSO创建与Shibboleth中的同名用户。

  1. 在云SSO的左侧导航栏,选择人员管理 > 用户

  2. 用户页面,单击创建用户

  3. 创建用户面板,输入用户名

    本示例中,用户名为testUser@testdomain.alicloud.com

  4. 设置用户状态为已启用。

  5. 单击关闭

(可选)步骤八:为用户授权

如果您计划用户SSO登录后访问资源目录指定成员账号中的指定资源,您还需要创建访问配置,并为用户在RD账号上授权。

  1. 在云SSO创建访问配置,定义权限策略。

    具体操作,请参见创建访问配置

  2. 为用户在RD账号上授权。

    具体操作,请参见在RD账号上授权

验证结果

完成上述配置后,您可以从阿里云或Shibboleth发起SSO登录。

  • 从阿里云侧发起登录

    1. 云SSO控制台概览页,复制用户登录地址。

    2. 使用新的浏览器打开复制的用户登录地址。

    3. 单击跳转,系统会自动跳转到Shibboleth的登录页面。云SSO登录跳转

    4. 在Shibboleth的登录界面,输入用户名(testUser)和密码,单击登录

      系统将自动SSO登录并重定向到云SSO用户门户。

    5. 访问RD账号中有权限的资源。

  • 从Shibboleth侧发起登录

    1. 访问https://<您的服务器地址>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>

      该链接中的<entityID>步骤一:在阿里云获取SAML服务提供商元数据中的阿里云entityID

    2. 在Shibboleth的登录界面,输入用户名(testUser)和密码,单击登录

      系统将自动SSO登录并重定向到云SSO用户门户。

    3. 访问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.propertiesattribute-resolver-full.xml文件中IDAP连接的相关配置。

登录后转跳阿里云,提示The NameID is missing

检查步骤三:配置Shibboleth返回的用户属性中是否正确将用户信息中的mail映射为属性,检查步骤四:配置SAML响应的NameIDNameID配置是否正确。

访问https://<您的服务器地址>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>时提示Unsupported Request

检查entityId是否配置正确。metadata文件夹下的元数据、attribute-filter.xmlrelying-party.xml三处中的entityId必须保持一致。

登录后转跳阿里云,提示The response signature is invalid

重新将Shibboleth的元数据文件上传到阿里云。