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

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

您可以使用 Web 身份或 OpenID Connect 联合身份验证 (OIDC) 身份提供商,而不必在 AWS 账户中创建 IAM 用户。利用身份提供商 (IdP),您可以管理 AWS 外部的用户身份,并向这些外部用户身份授予访问您账户中的 AWS 资源的权限。有关联合和身份提供商的更多信息,请参阅身份提供商和联合

创建用于 Web 身份或 OIDC 的角色的先决条件

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

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

  1. 以开发人员身份向一个或多个 IdP 注册。如果创建需要访问 AWS 资源的应用程序,则还需要使用提供商信息来配置应用程序。当您这样做时,提供商将为您提供一个对于您的应用程序唯一的应用程序 ID 或受众 ID。(不同的提供商使用不同的术语表示此过程。本指南使用术语配置 来表示通过提供商标识您的应用程序的过程。)可以对每个提供商配置多个应用程序,也可以对单个应用程序配置多个提供商。查看有关使用身份提供商的信息:

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

  3. 为已进行 IdP 身份验证的用户要代入的角色准备策略。正如任何角色一样,移动应用程序的角色包含两个策略。一个是指定谁可以代入角色的信任策略。另一个是指定允许或拒绝移动应用程序访问的 AWS 操作和资源的权限策略。

    对于 Web 身份提供商,我们建议您使用 Amazon Cognito 来管理身份。在这种情况下,请使用类似于以下示例的信任策略。

    { "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,则在创建信任策略时,必须使用三个值来确保只有您的应用程序可以代入此角色:

    • 对于 Action 元素,使用 sts:AssumeRoleWithWebIdentity 操作。

    • 对于 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:

      "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 创建单独的信任策略。

    以下示例信任策略是为用户从 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。

    { "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。

    { "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。

    { "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"}} }] }

创建用于 Web 身份或 OIDC 的角色

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

重要

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

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

  1. 登录 AWS 管理控制台 并通过以下网址打开 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 框中。

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

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

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

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

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

  8. IAM 包括您的账户中的 AWS 托管策略和客户托管策略的列表。选择要用于权限策略的策略,或选择创建策略以打开新的浏览器选项卡并从头开始创建新策略。有关更多信息,请参阅过程创建 IAM 策略(控制台)中的步骤 4。在您创建策略后,关闭该选项卡并返回到您的原始选项卡。选中您希望 Web 身份用户具有的权限策略旁边的复选框。如果您愿意,此时可以不选择任何策略,稍后将策略附加到角色。默认情况下,角色没有权限。

  9. (可选)设置权限边界。这是一项高级功能。

    打开设置权限边界部分,然后选择使用权限边界控制最大角色权限。选择要用于权限边界的策略。

  10. 选择 Next: Review

  11. 对于角色名称,键入角色名称。角色名称在您的 AWS 账户内必须是唯一的。名称不区分大小写。例如,您无法同时创建名为 PRODROLEprodrole 的角色。由于其他 AWS 资源可能引用该角色,角色创建完毕后无法编辑角色名称。

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

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