SAML 会话在 Amazon Cognito 用户池中启动 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

SAML 会话在 Amazon Cognito 用户池中启动

Amazon Cognito 支持服务提供商发起的(SP 发起的)单点登录 (SSO) 和 IDP 发起的 SSO。作为最佳安全实践,请在您的用户池中实施 SP 启动的 SSO。SAML V2.0 技术概述的第 5.1.2 节描述了 SP 启动的 SSO。Amazon Cognito 是您的应用程序的身份提供商 (IdP)。该应用程序是为经过身份验证的用户检索令牌的服务提供程序 (SP)。但是,当您使用第三方 IdP 对用户进行身份验证时,Amazon Cognito 就是 SP。当您的 SAML 2.0 用户使用 SP 启动的流程进行身份验证时,他们必须始终首先向 Amazon Cognito 发出请求,然后重定向到 IdP 进行身份验证。

对于某些企业使用案例,对内部应用程序的访问从企业 IdP 托管的控制面板上的书签开始。当用户选择书签时,IdP 会生成一个 SAML 响应并将其发送到 SP 以向应用程序验证用户身份。

您可以在用户池中配置 SAML IdP 以支持 IdP 启动的 SSO。当你支持 IDP 发起的身份验证时,Amazon Cognito 无法验证它是否已请求收到的 SAML 响应,因为 Amazon Cognito 不会通过 SAML 请求启动身份验证。在 SP 发起的 SSO 中,Amazon Cognito 会设置状态参数,以验证针对原始请求的 SAML 响应。通过 SP 发起的登录,您还可以防范跨站请求伪造 (CSRF)。

有关如何在不希望用户与用户池托管用户界面交互的环境中构建 SAM 的示例,请参阅。示例场景:在企业控制面板中为 Amazon Cognito 应用程序添加书签

使用 IDP 发起的 SAML SSO

在为 IDP 发起的 SAML 2.0 登录配置身份提供商时,您可以向用户池域中的saml2/idpresponse终端节点提供 SAML 断言,而无需在上启动会话。对端点授权具有此配置的用户池接受请求的应用程序客户端支持的用户池外部身份提供商发起 IdP 发起的 SAML 断言。以下步骤描述了配置和使用 IDP 启动的 SAML 2.0 提供商登录的整个过程。

  1. 创建或指定用户池和应用程序客户端。

  2. 在您的用户池中创建一个 SAML 2.0 IdP。

  3. 将您的 IdP 配置为支持 IdP 启动。IDP 发起的 SAML 引入了其他 SSO 提供商不受约束的安全注意事项。因此,您无法将非 SAML IdPs(包括用户池本身)添加到任何使用 SAML 提供商并通过 IDP 启动登录的应用程序客户端。

  4. 将 IDP 发起的 SAML 提供商与用户池中的应用程序客户端相关联。

  5. 将您的用户引导至 SAML IdP 的登录页面并检索 SAML 断言。

  6. 使用 SAML 断言将您的用户引导到您的用户池saml2/idpresponse终端节点。

  7. 接收 JSON 网络令牌 (JWT)。

要接受用户池中未经请求的 SAML 断言,必须考虑其对应用程序安全的影响。当您接受 IdP 发起的请求时,可能会出现请求欺骗和 CSRF 尝试。尽管您的用户池无法验证 IDP 发起的登录会话,但 Amazon Cognito 会验证您的请求参数和 SAML 断言。

此外,您的 SAML 声明不得包含InResponseTo索赔,并且必须在前 6 分钟内发出。

您必须使用 IDP 发起的 SAML 向您的提交请求。/saml2/idpresponse对于 SP 发起和托管的 UI 授权请求,您必须提供参数,将您请求的应用程序客户端、范围、重定向 URI 和其他详细信息标识为请求中的HTTP GET查询字符串参数。但是,对于 IDP 发起的 SAML 断言,您的请求的详细信息必须格式化为请求正文中的RelayState参数。HTTP POST请求正文还必须包含您的 SAML 断言作为参数。SAMLResponse

以下是对 IDP 发起的 SAML 提供商的请求示例。

POST /saml2/idpresponse HTTP/1.1 User-Agent: USER_AGENT Accept: */* Host: example.auth.us-east-1.amazoncognito.com Content-Type: application/x-www-form-urlencoded SAMLResponse=[Base64-encoded SAML assertion]&RelayState=identity_provider%3DMySAMLIdP%26client_id%3D1example23456789%26redirect_uri%3Dhttps%3A%2F%2Fwww.example.com%26response_type%3Dcode%26scope%3Demail%2Bopenid%2Bphone HTTP/1.1 302 Found Date: Wed, 06 Dec 2023 00:15:29 GMT Content-Length: 0 x-amz-cognito-request-id: 8aba6eb5-fb54-4bc6-9368-c3878434f0fb Location: https://www.example.com?code=[Authorization code]
Amazon Web Services Management Console
为 IdP 启动的 SAML 配置 IdP
  1. 创建用户池应用程序客户端和 SAML 身份提供商。

  2. 取消所有社交和 OIDC 身份提供商与您的应用程序客户端的关联(如果有)。

  3. 导航到用户池的 “登录体验” 选项卡。

  4. 在 “联合身份提供商登录” 下,编辑或添加 SAML 提供商。

  5. IDP 发起的 SAML 登录下,选择接受 SP 发起的、以及 IDP 发起的 SAML 断言。

  6. 选择 ‬保存更改

API/CLI

为 IdP 启动的 SAML 配置 IdP

使用CreateIdentityProviderUpdateIdentityProviderAPI 请求中的IDPInit参数配置 IDP 启动的 SAML。以下是支持 IdP 发起ProviderDetails的 SAML 的 IdP 示例。

"ProviderDetails": { "MetadataURL" : "https://myidp.example.com/saml/metadata", "IDPSignout" : "true", "RequestSigningAlgorithm" : "rsa-sha256", "EncryptedResponses" : "true", "IDPInit" : "true" }