AWS Identity and Access Management
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

创建用于 Web 联合身份验证或 OpenID Connect 联合身份验证的角色 (控制台)

您必须先完成以下先决条件步骤,然后才能创建用于 Web 联合身份验证的角色。

准备创建用于 Web 联合身份验证的角色

  1. 首先以开发人员身份向一个(或多个)IdP 注册。您还可以通过提供商配置您的应用程序;当您这样做时,提供商将为您提供一个对于您的应用程序唯一的应用程序 ID 或受众 ID。(提供商可能使用不同的术语表示此过程。本指南使用术语配置 来表示通过提供商标识您的应用程序的过程。)每个提供商均提供一个对于该提供商独一无二的应用程序 ID,因此如果按多个提供商的要求配置同一应用程序,则该应用程序将有多个应用程序 ID。可按每个提供商的要求配置多个应用程序。以下外部链接提供了有关使用身份提供商之一的信息:

  2. 从身份提供商获得必要信息后,可在 IAM 中创建一个身份提供商。有关更多信息,请参阅 创建 OpenID Connect (OIDC) 身份提供商

  3. 为已进行 IdP 身份验证的用户要代入的角色准备策略。正如任何角色一样,移动应用程序的角色含有两个策略。一个是信任策略,其中规定了可代入该角色的人员(可信实体或委托人)。另一个策略 (权限策略) 指定允许或拒绝移动应用程序访问的实际 AWS 操作和资源 (类似于用户或资源策略)。

    对于 Web 身份提供商,我们建议您使用 Amazon Cognito 来管理身份。在此情况下,角色的信任策略必须包含类似于下面这样的 Statement

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": {"Federated": "cognito-identity.amazonaws.com.cn"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": {"cognito-identity.amazonaws.com.cn:aud": "us-west-2:12345678-abcd-abcd-abcd-123456"}, "ForAnyValue:StringLike": {"cognito-identity.amazonaws.com.cn:amr": "unauthenticated"} }] }

    us-west-2:12345678-abcd-abcd-abcd-123456 替换为由 Amazon Cognito 分配给您的实际身份池 ID。

    如果手动配置 Web 身份 IdP,则信任策略必须为 sts:AssumeRoleWithWebIdentity 操作授予 Allow 效果。在此角色中使用两个值来确保只有您的应用程序可代入此角色:

    • 对于 Principal 元素,使用字符串 {"Federated":providerUrl/providerArn}

      • 对于一些常见的 OpenID Connect (OIDC) IdP,providerUrl 是完全限定 URL。以下是为一些常用 IdP 指定委托人的可接受的方式:

        "Principal":{"Federated":"cognito-identity.amazonaws.com.cn"}

        "Principal":{"Federated":"www.amazon.com"}

        "Principal":{"Federated":"graph.facebook.com"}

        "Principal":{"Federated":"accounts.google.com"}

      • 对于其他的 OIDC 提供商,请使用您在步骤 2中创建的 OIDC 身份提供商的 ARN,如下例所示:

        "Principal":{"Federated":"arn:aws:iam::123456789012:oidc-provider/server.example.com"}

    • Condition 元素中,使用 StringEquals 条件来限制权限。测试身份池 ID (对于 Amazon Cognito) 或应用程序 ID (对于其他提供商)。它应与您通过 IdP 配置应用程序时获得的应用程序 ID 一致。这样可确保请求来自您的应用程序。根据您使用的 IdP,对照以下策略变量检验您的应用程序 ID:

      "Condition": {"StringEquals": {"cognito-identity.amazonaws.com.cn:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}

      "Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}

      "Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}

      "Condition": {"StringEquals": {"accounts.google.com:aud": "66677788899900pro0"}}

      对于 OIDC 提供商,请将 OIDC IdP 的完全限定 URL 与 aud 上下文密钥一起使用,如以下示例所示:

      "Condition": {"StringEquals": {"server.example.com:aud": "appid_from_oidc_idp"}}

    注意,角色中的委托人的值将因 IdP 而异。一个角色只能指定一个委托人。因此,如果移动应用程序允许用户从多个 IdP 登录,则必须为您要支持的每个 IdP 创建一个角色。

    注意

    由于可信实体的策略使用表示 IdP 和应用程序 ID 的策略变量,因此必须将该策略的 Version 元素设置为 2012-10-17 或更高的受支持版本。

    下例展示了一个角色的信任策略,如果用户从 Login with Amazon 登录,则移动应用程序可代入该角色。在示例中,amzn1.application-oa2-123456 表示使用 Login with Amazon 配置应用程序时 Amazon 分配的应用程序 ID。

    { "Version": "2012-10-17", "Statement": [{ "Sid": "RoleForLoginWithAmazon", "Effect": "Allow", "Principal": {"Federated": "www.amazon.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}} }] }

    下例展示了一个角色的策略,如果用户已从 Facebook 登录,则移动应用程序可代入该角色。在此示例中,111222333444555 表示由 Facebook 分配的应用程序 ID。要了解如何使用该示例 JSON 策略文档创建 IAM 策略,请参阅在 JSON 选项卡上创建策略

    { "Version": "2012-10-17", "Statement": [{ "Sid": "RoleForFacebook", "Effect": "Allow", "Principal": {"Federated": "graph.facebook.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}} }] }

    下例展示了一个角色的策略,如果用户已从 Google 登录,则移动应用程序可代入该角色。在此示例中,666777888999000 表示由 Google 分配的应用程序 ID。要了解如何使用该示例 JSON 策略文档创建 IAM 策略,请参阅在 JSON 选项卡上创建策略

    { "Version": "2012-10-17", "Statement": [{ "Sid": "RoleForGoogle", "Effect": "Allow", "Principal": {"Federated": "accounts.google.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": {"StringEquals": {"accounts.google.com:aud": "666777888999000"}} }] }

    下例展示一个角色的策略,如果移动应用程序正在使用 Amazon Cognito,则此应用程序可担任该角色。在此示例中,us-east:12345678-ffff-ffff-ffff-123456 表示由 Amazon Cognito 分配的身份池 ID。要了解如何使用该示例 JSON 策略文档创建 IAM 策略,请参阅在 JSON 选项卡上创建策略

    { "Version": "2012-10-17", "Statement": [{ "Sid": "RoleForCognito", "Effect": "Allow", "Principal": {"Federated": "cognito-identity.amazonaws.com.cn"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": {"StringEquals": {"cognito-identity.amazonaws.com.cn:aud": "us-east:12345678-ffff-ffff-ffff-123456"}} }] }

    完成先决条件后,您可创建角色本身。以下过程介绍了如何在 AWS 管理控制台中创建用于 Web 联合身份验证/OIDC 联合身份验证的角色。要使用 AWS CLI、Windows PowerShell 工具 或 AWS API 创建角色,请参阅针对第三方身份提供商创建角色 (联合)中的过程。

创建适用于 Web 联合身份验证的 IAM 角色

如果您使用的是 Amazon Cognito,则应使用 Amazon Cognito 控制台来设置角色。否则,使用 IAM 控制台创建用于 Web 联合身份验证的角色。

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中单击 Roles,然后单击 Create role

  3. 选择 Web identity 角色类型。

  4. 身份提供商列表中,选择要为之创建角色的身份提供商:

    • 如果要为单个 Web 身份提供商创建角色,请选择以 Amazon 登录用 Facebook 登录用 Google 登录

      注意

      您必须为想要支持的每个身份提供商创建单独的角色。

    • 如果要为 Amazon Cognito 创建角色,请选择 Amazon Cognito

      注意

      您仅在处理高级方案时需要手动创建与 Amazon Cognito 一起使用的角色。其他情况下,Amazon Cognito 可为您创建适用于标准方案的角色。有关 Amazon Cognito 的更多信息,请参阅适用于 iOS 的 AWS 移动软件开发工具包开发人员指南中的 Amazon Cognito 身份,以及适用于 Android 的 AWS 移动软件开发工具包开发人员指南中的 Amazon Cognito 身份

  5. 键入您的应用程序的标识符。名称标识符设置随所选提供商发生变化:

    • 如果您正在为 Login with Amazon 创建角色,请将应用程序 ID 键入 Application ID 框中。

    • 如果您正在为 Amazon Cognito 创建角色,请在 Identity Pool ID 框中键入您为 Amazon Cognito 应用程序创建的身份池的 ID。

    • 如果您正在为 Facebook 创建角色,请将应用程序 ID 键入 Application ID 框中。

    • 如果为 Google 创建一个角色,请在受众框中键入受众名称。

  6. (可选) 单击 Add condition (optional) 以创建在应用程序的用户可以使用角色授予的权限之前必须满足的其他条件。例如,您可以添加一个条件,仅授权特定 IAM 用户 ID 访问 AWS 资源。

  7. 审查您的 Web 身份信息,然后选择 Next: Permissions

  8. 选择一个或多个要附加到角色的权限策略。默认状态下,角色没有权限。选中用于分配您希望 Web 身份用户拥有的权限的策略旁的框。然后选择 Next: Review

  9. 对于 Role name,键入有助于识别此角色的作用的角色名称。角色名称在您的 AWS 账户内必须是唯一的。名称不区分大小写。例如,您无法同时创建名为 PRODROLEprodrole 的角色。由于多个单位可能引用该角色,角色创建完毕后无法编辑角色名称。

  10. (可选) 对于 Role description,键入新角色的描述。

  11. 检查角色,然后选择 Create role