如何通过其他 AWS 账户中的 Amazon Cognito 用户池设置我的 Application Load Balancer,以对用户进行身份验证?

上次更新时间:2020 年 5 月 27 日

我想要在我的 Application Load Balancer 上使用 Amazon Cognito 身份验证,但我的用户池位于另一个 AWS 账户中。我能否使用跨账户用户池进行身份验证?

简短描述

目前,配置 Application Load Balancer 以进行用户身份验证时,默认仅支持相同账户中的 Amazon Cognito 用户池。但是,作为解决方法,您可以将跨账户用户池设置为 OpenID Connect (OIDC) 身份提供商 (IdP)

按照以下说明,将一个账户(“账户 B”)中的 Application Load Balancer 配置为通过另一个账户(“账户 A”)中的用户池进行身份验证。

解决方法

创建一个 Application Load Balancer

如果尚未创建,请在账户 B 中创建一个 Application Load Balancer(带有 HTTPS 侦听器)。

注意:HTTPS 侦听器仅支持 authenticate-cognitoauthenticate-oidc 规则操作类型

获取账户 B 中的 Application Load Balancer 的 DNS 名称

  1. 在账户 B 中,打开 Amazon Elastic Compute Cloud (Amazon EC2) 控制台的负载均衡器页面。
  2. 选择您的 Application Load Balancer。
  3. 描述选项卡上,复制您的负载均衡器的 DNS 名称。您需要此名称来访问您的负载均衡器的终端节点 URL,以便进行后续测试。

在账户 A 中创建和配置用户池

  1. 在账户 A 中,创建一个 Amazon Cognito 用户池(具有应用程序客户端)。对于应用程序客户端,务必选中生成客户端密钥复选框。有关更多信息,请参阅准备使用 Amazon Cognito
    注意:在用户池创建过程中,请针对生产配置所需的设置。创建用户池之后,有些用户池设置可能无法更改。例如,您无法更改用户注册所需的标准属性
  2. Amazon Cognito 控制台中,在用户池的常规设置页面上, 记下池 Id。您稍后需要此 ID 来获取用户池的 OIDC 配置详细信息。
  3. 在左侧导航窗格中的常规设置下,选择应用程序客户端
  4. 应用程序客户端页面上,执行以下操作:
    选择显示详细信息
    复制应用程序客户端 id应用程序客户端密钥。您稍后需要这些信息来配置 Application Load Balancer,以进行用户身份验证。
  5. 在左侧导航窗格中,在应用程序集成中,选择应用程序客户端设置
  6. 应用程序客户端设置页面上,执行以下操作:
    启用身份提供商下,选中 Cognito 用户池复选框。
    对于回调 URL,请输入 https://loadBalancerDNSName/oauth2/idpresponse。或者,如果您已使用 CNAME 记录将自定义域映射至您的负载均衡器,请输入 https://CNAME/oauth2/idpresponse
    注意:请将 loadBalancerDNSName 替换为您从 Amazon EC2 控制台中复制的 DNS 名称。如果您使用 CNAME 记录,请将 CNAME 替换为您的自定义域。
    对于注销 URL,请输入您希望用户在注销之后重定向至的 URL。如要进行测试,您可以输入任何有效的 URL,如 https://example.com/
    允许的 OAuth 流程下,至少选中授权代码授予复选框。
    允许的 OAuth 范围下,至少选中 openid 复选框。该 openid 范围将会返回一个 ID 令牌。根据您的需求选择任何其他 OAuth 范围。
  7. 选择保存更改
  8. 在左侧导航窗格中,在应用程序集成中,选择域名
  9. 为用户池添加域名

有关更多信息,请参阅配置用户池应用程序客户端向用户池添加 OIDC 身份提供商

获取用户池的 OIDC 配置详细信息

访问您的用户池的 OIDC 配置终端节点。您需要此配置详细信息来将用户池设置为 Application Load Balancer 上的 OIDC IdP。

  1. 在您的浏览器中,输入以下 URL:
    https://cognito-idp.region.amazonaws.com/userPoolId/.well-known/openid-configuration
    注意:region 替换为用户池所在的 AWS 区域。(例如,us-east-1。) 将 userPoolId 替换为先前记下的用户池 ID。
  2. 复制您在浏览器中看到的 JSON 响应。记下以下项的值:
    authorization_endpoint
    issuer
    scopes_supported
    token_endpoint
    userinfo_endpoint

在账户 B 中配置 Application Load Balancer

  1. 在账户 B 中,在 Amazon EC2 控制台的负载均衡器页面上,选择您的 Application Load Balancer。
  2. 侦听器选项卡上的规则下,为您的 HTTPS 侦听器选择查看/编辑规则
  3. 在菜单栏中,选择铅笔图标(编辑规则)。
  4. 在 HTTPS 侦听器的默认规则旁边,选择铅笔图标(编辑规则)。
  5. THEN 下,选择添加操作,然后执行以下操作:
    选择身份验证
    对于身份验证,选择 OIDC
    对于发布者,请输入用户池 OIDC 配置中的 issuer 值。
    对于授权终端节点,请输入 authorization_endpoint 值。
    对于令牌终端节点,请输入 token_endpoint 值。
    对于用户信息终端节点,请输入 userinfo_endpoint 值。
    对于客户端 ID,请输入您先前从 Amazon Cognito 控制台复制的应用程序客户端 id
    对于客户端密钥,请输入您先前复制的应用程序客户端密钥
    展开高级设置
    对于范围,请输入配置的用户池应用程序客户端的范围,以空格分隔。您可以在用户池的 OIDC 配置中找到范围。例如,如果配置中的 scopes_supported 值为 ["openid","email","phone","profile"],请输入 openid email phone profile
    选择复选标记图标。
  6. THEN 下,选择添加操作,然后执行以下操作:
    注意:如果无法选择添加操作,请使用垃圾桶图标删除现有路由操作(如重定向至),然后重试。
    选择转发到
    对于转发到,请选择一个或多个目标组。
    (可选)配置组级别粘性
    选择复选标记图标。
  7. 选择更新。此时将会更新 HTTPS 侦听器的默认规则。

有关更多信息,请参阅编辑规则

测试设置

在您的浏览器中,输入以下任一 URL:

  • https://loadBalancerDNSName/
  • https://CNAME/

注意:loadBalancerDNSName 替换为您先前从 Amazon EC2 控制台中复制的 DNS 名称。或者,将 CNAME 替换为您的自定义域。

此时您将重定向至用户池的 Amazon Cognito 托管 Web UI.当用户登录至此并且通过用户池身份验证时,它们将会重定向至目标。