使用 AWS Cognito 和 AD FS 作为 Web 应用程序的身份验证

Using AWS Cognito and AD FS as authentication for a web app

我们目前正在 AWS 上使用完整的无服务器堆栈构建 Web 应用程序。到目前为止,我们已经非常成功地使用 AWS Lambda、AWS DynamoDB 和 Cognito 用户池。此应用程序旨在成为企业应用程序,我的一位客户希望能够使用他们当前的 Active Directory 凭据登录所有用户。我过去曾在其他应用程序上使用过 AD FS,但事实证明要让它正常工作总是有点麻烦。

现在,我想向客户发送有关如何配置他们的 AD FS 信赖方信任以针对我的应用程序进行身份验证的说明。

我了解到,执行此操作的最佳方法是创建一个链接到 Cognito 用户池的 Cognito 身份提供者。在用户池中,您应该创建一个 SAML 提供程序并从 AD FS 服务器上传 metadata.xml。

我已经使用 AD FS 设置了一个实验室服务器,我可以让它正常工作。现在我不确定我在依赖方信任设置或 Cognito 设置方面做错了什么。我从事此工作多年,几乎阅读了我能找到的每篇博客文章。如果有人能帮助我或指出正确的方向,我将不胜感激。

在经历了很多挫折之后,我现在可以回答这个问题了,所以我决定为遇到这些问题的初学者整理一个简单的分步答案。

我只进入身份验证设置而不是授权。授权需要 IAM 角色和一些特定于体系结构的其他逻辑。我很乐意在别处讨论这个问题。

这种设置有 2 个组成部分:

  1. 具有联合身份提供商的 AWS Cognito 用户池
  2. Windows 安装了 AD FS 的服务器

创建 Cognito 用户池域

常规设置、select App 客户端 下的 Cognito 用户池中,如果有 [=182],则添加一个=](稍后您将需要 ID)。

然后转到应用程序集成下的域名并选择一个有效的域名前缀并保存。

依赖方信任 Windows AD FS

您需要让公司建立信赖方信托。所需步骤如下:

  1. 打开 AD FS 管理控制台
  2. 创建新的信赖方信任
  3. Select 手动输入详细信息
  4. 为信任输入一个易于识别为您的应用程序的名称
  5. Select 使用 ADFS 2.0
  6. 在这个例子中,不需要证书所以直接点击下一步
  7. Select复选框启用SAML 2.0协议并输入URL格式:https://<domain_prefix>.auth.<region>.amazoncognito.com/saml2/idpresponse(域前缀在上一步中设置)
  8. 依赖方信任标识符需要是 urn:amazon:cognito:sp:<pool-id>,其中 pool-id 是在用户池的 常规设置 中找到的 AWS Cognito 用户池 ID
  9. 允许所有用户进行身份验证(假设这是您的意图)

现在您需要向依赖方信任添加声明。

  1. 右键单击依赖方信任并单击编辑声明
  2. 创建一个发送 LDAP 属性的新声明
  3. 给它起个名字(我通常使用Profile,但这取决于你)
  4. 使属性存储在 Active Directory 中
  5. 根据需要填写table。一个要求是你有一个 Name ID 被返回(我通常使用 User-Principal-Name 映射到 Name ID )。 table 的其余部分是您需要的。例如,Given-Name 可以映射到 FName

AWS Cognito 用户池中的联合身份

因此,作为应用程序开发人员,您需要设置 Cognito 用户池。通过向导并选择您喜欢的设置。无论如何,联合身份不一定遵循与用户池本身相同的规则。

设置联合身份的步骤是:

  1. 在 Cognito 用户池 select Identity ProvidersFederation
  2. 点击 SAML
  3. 提供元数据文档端点(通常采用 https://<fqdn>/FederationMetadata/2007-06/FederationMetadata.xml 的形式)。如果您不能下载该文件并通过单击“Select 文件”
  4. 上传它
  5. 输入对您有意义的提供商名称,但确保名称中不要包含任何空格
  6. 标识符是可选的(请参阅下面的用法)
  7. 选中启用 IdP 注销流程将使您的用户退出其联合身份以及您的应用程序。
  8. 点击创建供应商

联合身份的属性映射

  1. 通过转到用户池中 Federation 下的 Attribute Mapping 创建联合身份的字段映射。
  2. Select SAML
  3. 单击添加 SAML 属性
  4. 确保选中捕获,输入上面的 SAML 属性(例如 FName)和 select 它映射到的用户池属性。

设置应用客户端

测试前的最后一步是设置您之前创建的应用程序客户端。

  1. 转到应用程序集成
  2. 下的应用程序客户端设置
  3. 输入相应应用程序客户端的设置
  4. Select 所有适当的身份提供者(特别是上面的设置)
  5. 您可以设置以逗号分隔的回调和注销列表 URL。回调 URLs 应该指向将在身份验证后使用令牌的某个地方(请参阅下面的测试)。
  6. Select OAuth 2.0 属性是必需的,但用于测试 select 除 客户端凭据
  7. 之外的所有内容

测试

要进行测试,您可以尝试几个不同的 URL,形式如下:-

  • https://<domain_prefix>.auth.<region>.amazoncognito.com/authorize?idp_identifier=<idp_identifier>&response_type=token&client_id=<app_client_id>&redirect_uri=<app_client_callback_URL> 直接进入授权端点
  • https://<domain_prefix>.auth.<region>.amazoncognito.com/login?response_type=token&client_id=<app_client_id>&redirect_uri=<app_client_callback_URL>去AWS托管登录UI

idp_identifier是创建联合身份时定义的可选字段。这在 URL 中也不是必需的。

This 单页 webapp 是一个很好的工具,可以用来测试事情是否正常运行以及您是否获得了所需的响应。

我希望这对其他人有帮助。