SAML IdPs 在 Amazon Cognito 用户池中需要知道的事情 - Amazon Cognito

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

  1. Amazon Cognito 支持大于 80 个字节的 relayState 值。虽然SAML规范规定该relayState值 “长度不得超过 80 字节”,但当前的行业实践往往会偏离这种行为。因此,拒绝大于 80 字节的relayState值将破坏许多标准SAML提供商集成。

  2. 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) 中的用户池 IDurn,也称为受众URISP 实体 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中的 A urn:oasis:names:tc:SAML:1.1:nameid-format:persistent 表示您的 IdP 正在传递一个不变的值。Amazon Cognito 不需要这种格式声明,如果您的 I urn: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 GETSAML请求包含有关您的用户池的信息,包括您的ACS终端节点。您可以选择对这些请求应用加密签名。

签署请求并加密响应

每个SAML提供商的用户池都会为 Amazon Cognito 分配SAML给请求的数字签名生成非对称密钥对和签名证书。您配置为支持加密SAML响应的每个外部 SAML IdP 都会导致 Amazon Cognito 为该提供商生成新的密钥对和加密证书。要查看和下载带有公钥的证书,请在 Amazon Cognito 控制台的登录体验选项卡中选择您的 IdP。

要与来自用户池的SAML请求建立信任,请向您的 IdP 提供您的用户池 SAML 2.0 签名证书的副本。如果您未将 IdP 配置为接受已签名的SAML请求,则您的 IdP 可能会忽略您的用户池签署的请求。

  1. Amazon Cognito 将数字签名应用于您的用户传递给您的 IdP 的SAML请求。您的用户池签署所有单点注销 (SLO) 请求,您可以将用户池配置为签署任何外部 SAML IdP 的单点登录 (SSO) 请求。当您提供证书副本时,您的 IdP 可以验证用户SAML请求的完整性。

  2. 您的 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绑定的注销响应。