将 SAML 提供商设置为身份池 IdP - Amazon Cognito

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

将 SAML 提供商设置为身份池 IdP

Amazon Cognito 支持通过安全断言标记语言 2.0 (SAML 2.0IdPs) 对身份提供商 () 进行身份验证。您可以使用支持 SAML 和 Amazon Cognito 的 IdP,为用户提供简单的引导流程。您支持 SAML 的 IdP 指定了用户可以承担的 IAM 角色。这样,不同的用户可以获得不同的权限集。

配置 SAML IdP 身份池

以下步骤介绍了如何配置身份池以使用基于 SAML 的 IdP。

注意

在配置身份池以支持 SAML 提供商前,您必须先在 IAM 控制台中配置 SAML IdP。有关更多信息,请参阅 IAM 用户指南中的将第三方 SAML 解决方案提供商与 AWS 集成

添加 SAML 身份提供者(IdP)
  1. Amazon Cognito 控制台中选择身份池。选择身份池。

  2. 选择用户访问选项卡。

  3. 选择添加身份提供者

  4. 选择 SAML

  5. 从您AWS 账户的 IAM 中选择一个 SAML 身份提供商 IdPs 。如果您想添加新的 SAML 提供者,请选择创建新的提供者以导航到 IAM 控制台。

  6. 要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色,请配置角色设置

    1. 您可以为该 IdP 中的用户分配您在配置经过身份验证的角色时设置的原定设置角色,也可以使用规则选择角色

      1. 如果您选择使用规则选择角色,请输入用户身份验证中的来源声明、您要用来比较声明的运算符、导致与该角色选择匹配的,以及当角色分配匹配时要分配的角色。选择添加其他,以根据不同的条件创建其他规则。

      2. 选择角色解析。当用户的声明与您的规则不匹配时,您可以拒绝凭证或为经过身份验证的角色颁发凭证。

  7. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签,请配置访问控制属性

    1. 如果不应用主体标签,请选择非活动

    2. 要基于 subaud 声明应用主体标签,请选择使用原定设置映射

    3. 要为主体标签创建自己的自定义属性模式,请选择使用自定义映射。然后,对于您要在标签中表示的每个声明,输入要从该声明中获取的标签键

  8. 选择保存更改

配置 SAML IdP

创建 SAML 提供程序后,配置 SAML IdP,以在 IdP 和 AWS 之间添加信赖方信任。使用 man IdPs y,您可以指定一个 URL,IdP 可以使用该网址从 XML 文档中读取信赖方信息和证书。对于 AWS,您可以使用 https://signin.aws.amazon.com/static/saml-metadata.xml。下一步是配置来自 IdP 的 SAML 断言响应,以填充 AWS 所需的声明。有关申请配置的详细信息,请参阅针对身份验证响应配置 SAML 断言

如果在 SAML 元数据中,您的 SAML IdP 包含多个签名证书,则在登录时,只要与 SAML 元数据中的任何证书匹配,您的用户群体就会确定 SAML 断言有效。

使用 SAML 自定义用户角色

将 SAML 与 Amazon Cognito 身份结合使用时,可针对终端用户自定义角色。Amazon Cognito 只支持对基于 SAML 的 IdP 使用增强流程。您无需为身份池指定经过身份验证或未经身份验证的角色,即可使用基于 SAML 的 IdP。https://aws.amazon.com/SAML/Attributes/Role 声明属性指定一个或多个逗号分隔的角色和提供商 ARN 对。这些是用户可以担任的角色。您可以配置 SAML IdP 以根据 IdP 提供的用户属性信息填充角色属性。如果您在 SAML 断言中收到多个角色,请在调用 getCredentialsForIdentity 时填充可选的 customRoleArn 参数。如果 customRoleArn 角色与 SAML 断言中的声明中的角色匹配,则用户将承担此角色。

使用 SAML IdP 对用户进行身份验证

要与基于 SAML 的 IdP 进行联合,请确定用户启动登录的 URL。AWS 联合使用 IdP 启动的登录。在 AD FS 2.0 中,URL 采用 https://<fqdn>/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=urn:amazon:webservices 格式。

要在 Amazon Cognito 中添加对 SAML IdP 的支持,请首先使用 SAML 身份提供商从 iOS 或 Android 应用程序对用户进行身份验证。您用于与 SAML IdP 集成和向其进行身份验证的代码特定于 SAML 提供商。对用户进行身份验证后,您可以使用 Amazon Cognito API 向 Amazon Cognito 身份提供生成的 SAML 断言。

您无法在身份池 API 请求的 Logins 映射中重复或重放 SAML 断言。重放的 SAML 断言的断言 ID 与早期 API 请求的 ID 重复。可以在Logins地图中接受 SAML 断言的 API 操作包括GetIdGetCredentialsForIdentityGetOpenIdToken、和 ID。GetOpen TokenForDeveloperIdentity您可以在身份池身份验证流程中对于每个 API 请求重放 SAML 断言 ID 一次。例如,您可以在 GetId 请求和后续 GetCredentialsForIdentity 请求中提供相同的 SAML 断言,但不能在第二个 GetId 请求中提供相同的 SAML 断言。

Android

如果您使用 Android 开发工具包,则可以使用 SAML 断言填充登录映射,如下所示。

Map logins = new HashMap(); logins.put("arn:aws:iam::aws account id:saml-provider/name", "base64 encoded assertion response"); // Now this should be set to CognitoCachingCredentialsProvider object. CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(context, identity pool id, region); credentialsProvider.setLogins(logins); // If SAML assertion contains multiple roles, resolve the role by setting the custom role credentialsProvider.setCustomRoleArn("arn:aws:iam::aws account id:role/customRoleName"); // This should trigger a call to the Amazon Cognito service to get the credentials. credentialsProvider.getCredentials();

iOS

如果您使用的是 iOS 开发工具包,您可以在 AWSIdentityProviderManager 中提供 SAML 断言,如下所示。

- (AWSTask<NSDictionary<NSString*,NSString*> *> *) logins { //this is hardcoded for simplicity, normally you would asynchronously go to your SAML provider //get the assertion and return the logins map using a AWSTaskCompletionSource return [AWSTask taskWithResult:@{@"arn:aws:iam::aws account id:saml-provider/name":@"base64 encoded assertion response"}]; } // If SAML assertion contains multiple roles, resolve the role by setting the custom role. // Implementing this is optional if there is only one role. - (NSString *)customRoleArn { return @"arn:aws:iam::accountId:role/customRoleName"; }