SAML 身份提供商(身份池) - Amazon Cognito

SAML 身份提供商(身份池)

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

配置 SAML IdP 身份池

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

注意

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

配置身份池以支持 SAML 提供商
  1. 登录到 Amazon Cognito 控制台,选择 Manage Identity Pools(管理身份池),然后选择 Create new identity pool(创建新的身份池)。

  2. Authentication providers(身份验证提供商)部分中,选择 SAML 选项卡。

  3. 选择 SAML 提供商的 ARN,然后选择 Create Pool(创建池)。

配置 SAML IdP

创建 SAML 提供程序后,配置 SAML IdP,以在 IdP 和 AWS 之间添加信赖方信任。对于许多 IdP,您可以指定一个 URL,IdP 可以使用该 URL 从 XML 文档中读取依赖方信息和证书。对于 AWS,您可以使用 https://signin.aws.amazon.com/static/saml-metadata.xml。下一步是配置来自 IdP 的 SAML 断言响应,以填充 AWS 所需的声明。有关申请配置的详细信息,请参阅针对身份验证响应配置 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 操作包括 GetIdGetCredentialsForIdentityGetOpenIdTokenGetOpenIDTokenForDeveloperIdentity。您可以在身份池身份验证流程中对于每个 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"; }