本文为您介绍进行角色SSO时SAML响应中必须包含的元素,尤其是SAML断言中的元素。

背景信息

在基于SAML 2.0的SSO流程中,当企业用户在IdP登录后,IdP将根据SAML 2.0 HTTP-POST绑定的要求生成包含SAML断言的认证响应,并由浏览器(或程序)自动转发给阿里云。这个SAML断言会被用来确认用户登录状态并从中解析出登录的主体。因此,断言中必须包含阿里云要求的元素,否则登录用户的身份将无法被确认,导致SSO失败。

SAML响应

请确保您的IdP向阿里云发出符合如下要求的SAML响应,每一个元素都必须要有,否则SSO将会失败。

<saml2p:Response>
    <saml2:Issuer>...</saml2:Issuer>
    <saml2p:Status>
        ...
    </saml2p:Status>
    <saml2:Assertion>
        <saml2:Issuer>...</saml2:Issuer>
        <ds:Signature>
            ...
        </ds:Signature>
        <saml2:Subject>
            <saml2:NameID>${NameID}</saml2:NameID>
            <saml2:SubjectConfirmation>
                ...
            </saml2:SubjectConfirmation>
        </saml2:Subject>
        <saml2:Conditions>
            <saml2:AudienceRestriction>
                <saml2:Audience>${Audience}</saml2:Audience>
            </saml2:AudienceRestriction>
        </saml2:Conditions>
        <saml2:AuthnStatement>
            ...
        </saml2:AuthnStatement>
        <saml2:AttributeStatement>
            <saml2:Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName">
                ...
            </saml2:Attribute>
            <saml2:Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/Role">
                ...
            </saml2:Attribute>
        </saml2:AttributeStatement>
    </saml2:Assertion>
</saml2p:Response>

SAML断言中的元素说明

  • SAML 2.0协议的通用元素
    元素 说明
    Issuer Issuer的值必须与您在阿里云创建的身份提供商实体中上传的IdP元数据文件中的EntityID匹配。
    Signature 阿里云要求SAML断言必须被签名以确保没有篡改,Signature及其包含的元素必须包含签名值、签名算法等信息。
    Subject

    Subject必须包含以下元素:

    • 有且仅有一个NameID元素。您必须按照SAML 2.0协议的要求自定义NameID的值,通常为SAML断言主体在IdP中的身份标识,阿里云不会依赖该元素的值来确认登录主体。
    • 有且仅有一个SubjectConfirmation元素,其中包含一个SubjectConfirmationData元素。SubjectConfirmationData必须有以下两个属性:
      • NotOnOrAfter:规定SAML断言的有效期。
      • Recipient:阿里云通过检查该元素的值来确保阿里云是该断言的目标接收方,其取值必须为 https://signin.alibabacloud.com/saml-role/sso

      以下是一个Subject元素的示例:

      <Subject>
        <NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">administrator</NameID>        
        <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">   
          <SubjectConfirmationData NotOnOrAfter="2019-01-01T00:01:00.000Z" Recipient="https://signin.alibabacloud.com/saml-role/sso"/>    
        </SubjectConfirmation>
      </Subject>
    Conditions

    Conditions元素中,必须包含一个AudienceRestriction元素,其中可包含一至多个Audience元素,但必须有一个Audience元素的取值为 urn:alibaba:cloudcomputing:international

    以下是一个Conditions元素的示例:

    <Conditions>
      <AudienceRestriction>
        <Audience>urn:alibaba:cloudcomputing:international</Audience>
      </AudienceRestriction>
    </Conditions>           
  • 阿里云要求的自定义元素

    在SAML断言的AttributeStatement元素中,必须包含以下阿里云要求的Attribute元素:

    • Name属性值为https://www.aliyun.com/SAML-Role/Attributes/RoleAttribute元素

      该元素为必选,可以有多个。其包含的AttributeValue元素取值代表允许当前用户扮演的角色,取值的格式是由角色ARN与身份提供商ARN组合而成的,中间用英文逗号(,)隔开。这两个ARN您可以在控制台获取:

      • 角色ARN:在RAM角色管理页面,单击RAM角色名称后,基本信息页面可以查看对应的ARN。
      • 身份提供商ARN:在SSO管理页面角色SSO页签下,单击身份提供商名称后,身份提供商信息页面可以查看对应的ARN。
      说明 如果是多个,当使用控制台登录时,将会在界面上列出所有角色供用户选择。

      以下是一个Role Attribute元素示例:

      <Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/Role">      
        <AttributeValue>acs:ram::$account_id:role/role1,acs:ram::$account_id:saml-provider/provider1</AttributeValue>
        <AttributeValue>acs:ram::$account_id:role/role2,acs:ram::$account_id:saml-provider/provider1</AttributeValue>
      </Attribute>               
      说明 $account_id是定义角色和身份提供商的阿里云账号ID。
    • Name属性值为https://www.aliyun.com/SAML-Role/Attributes/RoleSessionNameAttribute元素

      该元素为必选且只能有一个。其包含的AttributeValue元素取值将被用来作为登录用户信息的一部分显示在控制台上和操作审计日志中。如果您有多个用户使用同一个角色,请确保使用可以唯一标识用户的RoleSessionName值,以区分不同的用户,如员工ID、Email地址等。

      AttributeValue元素取值要求:长度不少于2个字符且不超过32个字符,只能是英文字母、数字和以下特殊字符:-_.@=

      以下是一个RoleSessionName Attribute元素示例:

      <Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName">
        <AttributeValue>user_id</AttributeValue>
      </Attribute>                     
    • Name属性值为https://www.aliyun.com/SAML-Role/Attributes/SessionDurationAttribute元素

      该元素为可选且最多只能有一个。其包含的AttributeValue元素取值为整数,单位为秒,最小值为900,最大值不能超过Role元素所代表的角色的最大会话时间。

      以下是一个SessionDuration Attribute元素示例:

      <Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/SessionDuration">
        <AttributeValue>1800</AttributeValue>
      </Attribute>                  
  • 登录会话有效期

    通过控制台登录的情况下,通常SAML断言中设置的SessionDuration值将会被作为会话的有效期。如果您还定义了AuthnStatement元素的SessionNotOnOrAfter属性,那么SessionDurationSessionNotOnOrAfter的较小值将会被作为会话的有效期。如果以上两个值均不存在,则会话有效期取角色最大会话时间设置的值。登录会话有效期还会受到登录Session过期时间的限制,即最终的登录会话有效期将不会超过此参数设置的值。详情请参见设置RAM用户安全策略设置角色最大会话时间

    通过程序登录的情况下,如果您在调用AssumeRoleWithSAML时指定了DurationSeconds参数,同时您还定义了AuthnStatement元素的SessionNotOnOrAfter属性,那么SessionDurationSessionNotOnOrAfter的较小值将会被作为STS Token有效期。如果以上两个值均不存在,则有效期取默认值3600秒。