设置 SAML 提供者作为身份池 IdP
借助 Amazon Cognito 身份池,您可以通过 SAML 2.0,使用身份提供者(IdP)进行用户身份验证。您可以使用支持 SAML 和 Amazon Cognito 的 IdP,为用户提供简单的引导流程。您支持 SAML 的 IdP 指定了用户可以承担的 IAM 角色。这样,不同的用户可以获得不同的权限集。
配置 SAML IdP 身份池
以下步骤介绍了如何配置身份池以使用基于 SAML 的 IdP。
注意
在配置身份池以支持 SAML 提供商前,您必须先在 IAM 控制台
添加 SAML 身份提供者(IdP)
-
从 Amazon Cognito 控制台
中选择身份池。选择身份池。 -
选择用户访问选项卡。
-
选择添加身份提供者。
-
选择 SAML。
-
从您的 Amazon Web Services 账户的 IAM IdP 中选择 SAML 身份提供者。如果您想添加新的 SAML 提供者,请选择创建新的提供者以导航到 IAM 控制台。
-
要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色,请配置角色设置。
-
您可以为该 IdP 中的用户分配您在配置经过身份验证的角色时设置的原定设置角色,也可以使用规则选择角色。
-
如果您选择使用规则选择角色,请输入用户身份验证中的来源声明、您要用来比较声明的运算符、导致与该角色选择匹配的值,以及当角色分配匹配时要分配的角色。选择添加其他,以根据不同的条件创建其他规则。
-
选择角色解析。当用户的声明与您的规则不匹配时,您可以拒绝凭证或为经过身份验证的角色颁发凭证。
-
-
-
要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签,请配置访问控制属性。
-
如果不应用主体标签,请选择非活动。
-
要基于
sub
和aud
声明应用主体标签,请选择使用原定设置映射。 -
要为主体标签创建自己的自定义属性模式,请选择使用自定义映射。然后,对于您要在标签中表示的每个声明,输入要从该声明中获取的标签键。
-
-
选择保存更改。
配置 SAML IdP
创建 SAML 提供程序后,配置 SAML IdP,以在 IdP 和 Amazon 之间添加信赖方信任。对于许多 IdP,您可以指定一个 URL,IdP 可以使用该 URL 从 XML 文档中读取依赖方信息和证书。对于 Amazon,您可以使用 https://signin.aws.amazon.com/static/saml-metadata.xml
如果在 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。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 断言。
您无法在身份池 API 请求的 Logins
映射中重复或重放 SAML 断言。重放的 SAML 断言的断言 ID 与早期 API 请求的 ID 重复。可以在 Logins
映射中接受 SAML 断言的 API 操作包括 GetId、GetCredentialsForIdentity、GetOpenIdToken 和 GetOpenIDTokenForDeveloperIdentity。您可以在身份池身份验证流程中对于每个 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"; }