本文为您介绍进行角色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协议的通用元素
关于SAML 2.0协议的更多内容,请参见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/Role
的Attribute
元素该元素为必选,可以有多个。其包含的
AttributeValue
元素取值代表允许当前用户扮演的角色,取值的格式是由角色ARN与身份提供商ARN组合而成的,中间用半角逗号(,)隔开。这两个ARN您可以在控制台获取:角色ARN:在角色页面,单击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/RoleSessionName
的Attribute
元素该元素为必选且只能有一个。其包含的
AttributeValue
元素取值将被用来作为登录用户信息的一部分显示在控制台上和操作审计日志中。如果您有多个用户使用同一个角色,请确保使用可以唯一标识用户的RoleSessionName
值,以区分不同的用户,如员工ID、Email地址等。其
AttributeValue
元素取值要求:长度不少于2个字符且不超过64个字符,只能是英文字母、数字和特殊字符-_.@=
。以下是一个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/SessionDuration
的Attribute
元素该元素为可选且最多只能有一个。其包含的
AttributeValue
元素取值为整数,单位为秒,最小值为900,最大值不能超过Role元素所代表的角色的最大会话时间。以下是一个SessionDuration
Attribute
元素示例:<Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/SessionDuration"> <AttributeValue>1800</AttributeValue> </Attribute>
登录会话有效期
通过控制台登录的情况下,通常SAML断言中设置的
SessionDuration
值将会被作为会话的有效期。如果您还定义了AuthnStatement
元素的SessionNotOnOrAfter
属性,那么SessionDuration
与SessionNotOnOrAfter
的较小值将会被作为会话的有效期。如果以上两个值均不存在,则会话有效期取角色最大会话时间设置的值。登录会话有效期还会受到登录会话的过期时间的限制,即最终的登录会话有效期将不会超过此参数设置的值。详情请参见管理RAM用户安全设置、设置RAM角色最大会话时间。通过程序登录的情况下,如果您在调用AssumeRoleWithSAML时指定了
DurationSeconds
参数,同时您还定义了AuthnStatement
元素的SessionNotOnOrAfter
属性,那么DurationSeconds
与SessionNotOnOrAfter
的较小值将会被作为STS Token有效期。如果以上两个值均不存在,则有效期取默认值3600秒。