SAML 身份提供商(身份池)
Amazon Cognito 支持通过身份提供商 (IdP) 并运用安全断言标记语言 2.0(SAML 2.0)进行身份验证。您可以使用支持 SAML 和 Amazon Cognito 的 IdP,为用户提供简单的引导流程。您支持 SAML 的 IdP 指定了用户可以承担的 IAM 角色。这样,不同的用户可以获得不同的权限集。
配置 SAML IdP 身份池
以下步骤介绍了如何配置身份池以使用基于 SAML 的 IdP。
注意
在配置身份池以支持 SAML 提供商前,您必须先在 IAM 控制台
配置身份池以支持 SAML 提供商
-
登录到 Amazon Cognito 控制台
,选择 Manage Identity Pools(管理身份池),然后选择 Create new identity pool(创建新的身份池)。 -
在Authentication providers(身份验证提供商)部分中,选择 SAML 选项卡。
-
选择 SAML 提供商的 ARN,然后选择 Create Pool(创建池)。
配置 SAML IdP
创建 SAML 提供程序后,配置 SAML IdP,以在 IdP 和 Amazon 之间添加信赖方信任。对于许多 IdP,您可以指定一个 URL,IdP 可以使用该 URL 从 XML 文档中读取依赖方信息和证书。对于 Amazon,您可以使用 https://signin.aws.amazon.com/static/saml-metadata.xml
使用 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。Amazon 联合使用 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 断言。
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"; }