本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
SAML IdPs 在 Amazon Cognito 用户池中需要知道的事情
SAML2.0 IdP 的实施有一些要求和限制。在实施 IdP 时,请参阅本节。您还将找到一些有用的信息,这些信息有助于解决与用户池SAML联合期间出现的错误。
- Amazon Cognito 会为您处理SAML断言
-
Amazon Cognito 用户池支持带有绑定终端节点的 SAML 2.0 联合POST。这使您的应用程序无需检索或解析SAML断言响应,因为用户池通过用户代理直接接收来自您的 IdP 的SAML响应。您的用户池代表您的应用程序充当服务提供商(SP)。Amazon Cognito 支持 SP 启动和 IDP 启动的单点登录 (SSO),如 V2.0 技术概述第 5.1.2 和 5.1.4 节中所述。SAML
- 提供有效的 IdP 签名证书
-
在用户池中配置 SAML IdP 时,SAML提供商元数据中的签名证书不得过期。
- 用户池支持多个签名证书
-
如果您的 SAML IdP 在元数据中包含多个签名证书,则在登录时,如果断言与SAML元数据中的任何证书匹配,则您的用户池将确定该SAML断言有效。SAML每个签名证书的长度不得超过 4,096 个字符。
- 维护继电器状态参数
-
Amazon Cognito 和你的 SAML IdP 使用参数维护会话信息。
relayState
-
Amazon Cognito 支持大于 80 个字节的
relayState
值。虽然SAML规范规定该relayState
值 “长度不得超过 80 字节”,但当前的行业实践往往会偏离这种行为。因此,拒绝大于 80 字节的relayState
值将破坏许多标准SAML提供商集成。 -
该
relayState
令牌不透明地引用了由 Amazon Cognito 维护的状态信息。Amazon Cognito 不保证relayState
参数的内容。不要解析其内容,以免您的应用程序依赖解析结果。有关更多信息,请参阅 SAML2.0 规范。
-
- 识别ACS终端节点
-
您的SAML身份提供商要求您设置断言使用者端点。您的 IdP 使用他们的断言将您的用户重定向到此端点。SAML在您的用户池域中配置以下端点,以便在SAML身份提供商中进行 SAML 2.0 POST 绑定。
https://
Your user pool domain
/saml2/idpresponse With an Amazon Cognito domain: https://mydomain.us-east-1.amazoncognito.com
/saml2/idpresponse With a custom domain: https://auth.example.com
/saml2/idpresponse有关用户群体域的更多信息,请参阅 配置用户池域。
- 没有重播的断言
-
您不能重复或重播对您的 Amazon
saml2/idpresponse
Cognito 终端节点的SAML断言。重播的SAML断言的断言 ID 与之前的 IdP 响应的 ID 重复。 - 用户池 ID 是 SP 实体 ID
-
您必须向 IdP 提供您在服务提供商 (SP) 中的用户池 ID
urn
,也称为受众URI或 SP 实体 ID。您的用户池URI的受众采用以下格式。urn:amazon:cognito:sp:
us-east-1_EXAMPLE
您可以在 Amazon Cognito
控制台的用户池概述下找到您的用户池 ID。 - 映射所有必需的属性
-
将您的 SAML IdP 配置为根据需要在用户池中设置的任何属性提供值。例如,
email
是用户群体的通用必需属性。在您的用户登录之前,您的 SAML IdP 断言必须包含您映射到用户池属性的声明。email
有关属性映射的更多信息,请参阅将 IdP 属性映射到配置文件和令牌。 - 断言格式有特定的要求
-
您的 SAML IdP 必须在断言中包含以下声明。SAML
-
一项
NameID
索赔。Amazon Cognito 通过以下方式将SAML断言与目标用户关联起来。NameID
如果NameID
发生变化,Amazon Cognito 会认为该声明是针对新用户的。您在 IdP 配置NameID
中设置的属性必须具有永久值。要将SAML用户分配到用户池中一致的用户个人资料,请根据一个值不变的属性分配您的NameID
声明。<saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:persistent"> carlos </saml2:NameID>
您的 IdP
NameID
声明Format
中的 Aurn:oasis:names:tc:SAML:1.1:nameid-format:persistent
表示您的 IdP 正在传递一个不变的值。Amazon Cognito 不需要这种格式声明,如果您的 Iurn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
dP 没有指定索赔的格式,则会分配一种格式。NameID
此行为符合 2. SAML0 规范第 2.2.2 节 “复杂类型 N ameIDType”。 -
一项
AudienceRestriction
声明,所具有的Audience
值将您的用户群体 SP 实体 ID 设置为响应的目标。<saml:AudienceRestriction> <saml:Audience> urn:amazon:cognito:sp:
us-east-1_EXAMPLE
</saml:AudienceRestriction> -
对于 SP 发起的单点登录,其
InResponseTo
值为原始SAML请求 ID 的Response
元素。<saml2p:Response Destination="https://
mydomain.us-east-1.amazoncognito.com
/saml2/idpresponse" ID="id123
" InResponseTo="_dd0a3436-bc64-4679-a0c2-cb4454f04184" IssueInstant="Date-time stamp
" Version="2.0" xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:xs="http://www.w3.org/2001/XMLSchema">注意
IDP 发起的SAML断言不得包含值。
InResponseTo
-
一个
SubjectConfirmationData
元素,其Recipient
值为你的用户池saml2/idpresponse
终端节点,对于 SP 发起的SAML,其InResponseTo
值与原始SAML请求 ID 相匹配。<saml2:SubjectConfirmationData InResponseTo="_dd0a3436-bc64-4679-a0c2-cb4454f04184" NotOnOrAfter="
Date-time stamp
" Recipient="https://mydomain.us-east-1.amazoncognito.com
/saml2/idpresponse"/>
-
- SP 发起的登录请求
-
当对端点授权将您的用户重定向到您的 IdP 登录页面时,Amazon Cognito 会在请求的参数中URL包含SAML一个请求。
HTTP GET
SAML请求包含有关您的用户池的信息,包括您的ACS终端节点。您可以选择对这些请求应用加密签名。 - 签署请求并加密响应
-
每个SAML提供商的用户池都会为 Amazon Cognito 分配SAML给请求的数字签名生成非对称密钥对和签名证书。您配置为支持加密SAML响应的每个外部 SAML IdP 都会导致 Amazon Cognito 为该提供商生成新的密钥对和加密证书。要查看和下载带有公钥的证书,请在 Amazon Cognito 控制台的登录体验选项卡中选择您的 IdP。
要与来自用户池的SAML请求建立信任,请向您的 IdP 提供您的用户池 SAML 2.0 签名证书的副本。如果您未将 IdP 配置为接受已签名的SAML请求,则您的 IdP 可能会忽略您的用户池签署的请求。
-
Amazon Cognito 将数字签名应用于您的用户传递给您的 IdP 的SAML请求。您的用户池签署所有单点注销 (SLO) 请求,您可以将用户池配置为签署任何外部 SAML IdP 的单点登录 (SSO) 请求。当您提供证书副本时,您的 IdP 可以验证用户SAML请求的完整性。
-
您的 SAML IdP 可以使用加密证书SAML对响应进行加密。当您为 IdP 配置SAML加密功能时,您的 IdP 只能发送加密的响应。
-
- 对非字母数字字符进行编码
-
Amazon Cognito 不接受 4 字节的 -8 个字符UTF,比如 😐 或者 𠮷 你的 IdP 作为属性值传递。您可以将字符编码为 Base64,将其作为文本传递,然后在应用程序中对其进行解码。
在以下示例中,将不接受属性声明:
<saml2:Attribute Name="Name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">😐</saml2:AttributeValue> </saml2:Attribute>
与上述示例不同,将接受以下属性声明:
<saml2:Attribute Name="Name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">8J+YkA==</saml2:AttributeValue> </saml2:Attribute>
- 元数据端点必须具有有效的传输层安全性
-
例如,如果您在使用HTTPS元数据端点创建 SAML IdP
InvalidParameterException
时看到URL,“从中检索元数据时出错<metadata endpoint>
,” 请确保元数据端点已SSL正确设置并且有与之关联的有效SSL证书。有关验证证书的更多信息,请参阅什么是SSL/TLS证书? 。 - 已启动 IDP 的应用程序客户端SAML只能使用以下方式登录 SAML
-
当您激活对支持 IdP 启动登录应用程序客户端的 SAML 2.0 IdP 的支持时,您只能 IdPs 向该应用程序客户端添加其他 SAML 2.0。您无法将用户池中的用户目录以及所有非SAML外部身份提供者添加到以这种方式配置的应用程序客户端。
- 注销响应必须使用绑定 POST
-
终
/saml2/logout
端节点LogoutResponse
接受HTTP POST
请求。用户池不接受带有HTTP GET
绑定的注销响应。