Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

SAML 身份提供商 (身份池)

Amazon Cognito 支持通过身份提供商并运用安全断言标记语言 2.0 (SAML 2.0) 来进行身份验证。您可以使用支持 SAML 和 Amazon Cognito 的身份提供商,为用户提供简单的登录流程。支持 SAML 的身份提供商可以指定可由用户担任的 IAM 角色,以便授予不同的用户不同的权限集。

为 SAML 提供商配置身份池

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

注意

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

配置身份池以支持 SAML 提供商

  1. 登录 Amazon Cognito 控制台,选择 Manage Federated Identities,然后选择 Create new identity pool

  2. Authentication providers 部分中,选择 SAML 选项卡。

  3. 选择 SAML 提供商的 ARN,然后选择 Create Pool

配置 SAML 身份提供商

创建 SAML 提供商后,配置 SAML 身份提供商,以在身份提供商和 AWS 之间添加信赖方信任。许多身份提供商允许指定一个 URL,以便其从中读取包含信赖方信息和证书的 XML 文档。对于 AWS,可以使用 https://signin.www.amazonaws.cn/static/saml-metadata.xml. 下一步是配置来自身份提供商的 SAML 断言响应,以填充 AWS 所需的断言。有关断言配置的详细信息,请参阅针对身份验证响应配置 SAML 断言

使用 SAML 自定义用户角色

通过将 SAML 与 Amazon Cognito 身份 结合使用,可针对最终用户自定义角色。基于 SAML 的身份提供商仅支持增强型流程。您无需为身份池指定经过身份验证或未经身份验证的角色,即可使用基于 SAML 的身份提供商。https://www.amazonaws.cn/SAML/Attributes/Role 断言属性指定一个或多个逗号分隔的角色和提供商 ARN 对。这些是允许用户担任的角色。可对 SAML 身份提供商进行配置,以根据身份提供商提供的用户属性信息填充角色属性。如果 SAML 断言中收到了多个角色,则应在调用 getCredentialsForIdentity 时填充可选参数 customRoleArn。如果参数中收到的输入角色与 SAML 断言中断言的角色相匹配,则该角色将由用户担任。

使用 SAML 身份提供商对用户进行身份验证

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

要在 Amazon Cognito 中添加对 SAML 身份提供商的支持,您必须先使用 SAML 身份提供商从 iOS 或 Android 应用程序对用户进行身份验证。用于通过 SAML 身份提供商进行集成和身份验证的代码因 SAML 身份提供商而异。对用户进行身份验证后,您可以使用 Amazon Cognito API 向 Amazon Cognito 身份 提供生成的 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 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"; }