创建用于 Web 联合身份验证或 OpenID Connect 联合身份验证的角色(控制台) - Amazon Identity and Access Management
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

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

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

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

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

  1. 注册一项或多项提供 OIDC 联合身份的服务。如果创建需要访问 Amazon 资源的应用程序,则还需要使用提供商信息来配置应用程序。当您执行此操作时,提供程序会为您提供一个应用程序 ID 或受众 ID,该 ID 在您的应用程序中具有唯一性。(不同的提供程序使用不同的术语表示此过程。此指南使用配置一词表示通过提供程序标识应用程序的过程。) 可以对每个提供商配置多个应用程序,也可以对单个应用程序配置多个提供商。查看有关使用身份提供程序的信息,如下所示:

  2. 从 IdP 接收必要信息后,在 IAM 中创建 IdP。有关更多信息,请参阅创建 OpenID Connect (OIDC) 身份提供程序

    重要

    如果您使用的是 Google、Facebook 或 Amazon Cognito 的 OIDC IdP,请勿在 Amazon Web Services Management Console 中创建单独的 IAM IdP。这些 OIDC 身份提供程序已内置到 Amazon,并可供您使用。跳过此步骤并在以下步骤中使用 IdP 创建新角色。

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

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

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

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

    如果您手动配置 Web 身份 IdP,则在创建信任策略时,必须使用三个值来确保只有您的应用程序可以担任此角色:

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

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

      • 对于一些常见的 OIDC IdP,providerUrl 是 URL。以下示例包括为一些常见 IdP 指定主体的方法:

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

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

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

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

      • 对于其他的 OIDC 提供程序,请使用您在 步骤 2 中创建的 OIDC IdP 的 Amazon 资源名称(ARN),如下例所示:

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

    • 对于 Condition 元素,使用 StringEquals 条件来限制权限。测试身份池 ID(对于 Amazon Cognito)或应用程序 ID(对于其他提供商)。身份池 ID 应与您通过 IdP 配置应用程序时获得的应用程序 ID 一致。ID 一致可确保请求来自您的应用程序。根据您所使用的 IdP 创建类似于以下示例之一的条件元素:

      "Condition": {"StringEquals": {"cognito-identity.amazonaws.com: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 而异。用于 Web 联合身份验证或 OIDC 的角色只能指定一个主体。因此,如果移动应用程序允许用户从多个 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"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}} }] }

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

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

重要

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

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

  1. 登录 Amazon Web Services Management Console,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择 Roles,然后选择 Create role

  3. 选择 Web Identity(Web 联合身份验证)角色类型。

  4. 对于 Identity provider(身份提供程序),请为您的角色选择 IdP:

    • 如果要为单个 Web IdP 创建角色,请选择 Login with AmazonFacebookGoogle

      注意

      您必须为想要支持的每个 IdP 创建单独的角色。

    • 如果要为 Amazon Cognito 创建高级方案角色,请选择 Amazon Cognito

      注意

      您仅在处理高级方案时需要手动创建与 Amazon Cognito 一起使用的角色。否则,Amazon Cognito 可以为您创建角色。有关 Amazon Cognito 的更多信息,请参阅 Amazon 移动 SDK for iOS 开发人员指南中的 Amazon Cognito 身份,以及 Amazon 移动 SDK for Android 开发人员指南中的 Amazon Cognito 身份

  5. 输入您的应用程序标识符。标识符的标签会根据所选提供程序发生变化:

    • 如果要为 Login with Amazon 创建角色,请在 Application ID(应用程序 ID)框中输入应用程序 ID。

    • 如果要为 Facebook 创建角色,请在 Application ID(应用程序 ID)框中输入应用程序 ID。

    • 如果要为 Google 创建角色,请在 Audience(受众)框中输入受众名称。

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

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

  7. 检查 Web 身份信息,然后选择 Next(下一步)。

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

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

    打开 Permissions boundary(权限边界)部分,然后选择 Use a permissions boundary to control the maximum role permissions(使用权限边界控制最大角色权限)。选择要用于权限边界的策略。

  10. 选择 Next (下一步)

  11. 对于 Role name(角色名称),输入一个角色名称。角色名称在您的 Amazon Web Services 账户 内必须是唯一的。不区分大小写。例如,您无法同时创建名为 PRODROLEprodrole 的角色。由于其他 Amazon 资源可能会引用此角色,因此您无法在创建角色后编辑角色名称。

  12. (可选)对于 Description(描述),输入新角色的描述。

  13. 要编辑角色的使用案例和权限,在 Step 1: Select trusted entities(步骤 1:选择可信实体)或 Step 2: Add permissions(步骤 2:添加权限)部分中选择 Edit(编辑)。

  14. (可选)要向角色添加元数据,请以键值对的形式附加标签。有关在 IAM 中使用标签的更多信息,请参阅 标记 IAM 资源

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

为 GitHub OIDC 身份提供程序配置角色

如果您将 GitHub 用作 OIDC IdP,则最佳实践是限制可以代入与 IAM IdP 关联的角色的实体。如果信任策略中包含条件语句,则可将角色限制为特定的 GitHub 组织、存储库或分支。您可以使用条件键 token.actions.githubusercontent.com:sub 限制访问。我们建议您将条件限制为一组特定的存储库或分支。如果您未包含此条件,则来自您控制范围之外的组织或存储库的 GitHub 操作可代入与您 Amazon Web Services 账户 中 GitHub IAM IdP 关联的角色。有关如何将 Amazon 配置为联合身份以信任 GitHub 的 OIDC 的信息,请参阅 GitHub 文档 – 在 Amazon Web Services 中配置 OpenID Connect

以下示例信任策略限制对定义的 GitHub 组织、存储库和分支的访问。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::012345678910:oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:ref:refs/heads/GitHubBranch" } } } ] }

以下示例条件限制对定义的 GitHub 组织和存储库的访问,但授予对存储库内任何分支的访问权限。

"Condition": { "StringLike": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:*" } }

以下示例条件限制对定义的 GitHub 组织内任何存储库或分支的访问。我们建议将此作为将 GitHub 用作 OIDC IdP 的角色的最低信任策略条件。

"Condition": { "StringLike": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/*" } }

有关可用于策略中的条件检查的 Web 联合身份验证密钥的更多信息,请参阅Amazon Web 联合身份验证的可用键