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

Posted

技术标签:

【中文标题】使用 AWS Cognito 和 AD FS 作为 Web 应用程序的身份验证【英文标题】:Using AWS Cognito and AD FS as authentication for a web app 【发布时间】:2018-10-23 06:24:56 【问题描述】:

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

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

我已经读过,最好的方法是创建一个链接到 Cognito 用户池的 Cognito 身份提供程序。在用户池中,您应该创建一个 SAML 提供程序并从 AD FS 服务器上传 metadata.xml。

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

【问题讨论】:

您遇到的是 ADFS 错误还是 Cognito 错误? @nzpcmad 我设法把它整理出来,但为了回答你的问题,我实际上在不同的时间遇到​​了不同的错误。 您的 AD FS 服务器是否也在 AWS 中运行?还是在公司网络中?如果是后者,您是如何安全连接到它的? 测试是在 AWS 上运行的。对于我的客户,他们的服务器在其公司网络中的站点上运行。他们处理了所有的安全证书。不幸的是,这不是我的专业领域,但它都得到了妥善保护和处理。 相关:***.com/q/47655162/843660 【参考方案1】:

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

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

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

    具有联合身份提供商的 AWS Cognito 用户池 安装了 AD FS 的 Windows Server

创建 Cognito 用户池域

常规设置下的 Cognito 用户池中,选择 App clients,如果没有则添加一个(稍后您将需要 ID)。

然后转到App Integration下的Domain Name并选择一个有效的域前缀并保存。

Windows AD FS 中的依赖方信任

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

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

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

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

AWS Cognito 用户池中的联合身份

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

设置联合身份的步骤如下:

    在 Cognito 用户池中,选择 Federation 下的 Identity Providers 点击 SAML 提供元数据文档端点(通常采用https://<fqdn>/FederationMetadata/2007-06/FederationMetadata.xml 的形式)。如果您无法下载该文件并点击“选择文件”进行上传 输入对您有意义的提供商名称,但请确保不要在名称中添加任何空格 标识符是可选的(请参阅下文了解它们的使用) 选中启用 IdP 退出流程将使您的用户退出其联合身份以及退出时的应用程序。 点击创建提供者

联合身份的属性映射

    通过转到用户池中 Federation 下的 Attribute Mapping,为 Federated Identity 创建字段映射。 选择SAML 单击添加 SAML 属性 确保选中 Capture,从上方输入 SAML 属性(例如 FName)并选择它映射到的用户池属性。

设置应用客户端

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

    转到应用集成下的应用客户端设置 输入相应应用客户端的设置 选择所有合适的身份提供者(特别是上面的一个设置) 您可以设置以逗号分隔的回调和注销 URL 列表。回调 URL 应指向将在身份验证后使用令牌的位置(请参阅下面的测试)。 根据需要选择 OAuth 2.0 属性,但要进行测试,请选择除 客户端凭据之外的所有内容

测试

要进行测试,您可以尝试以下形式的几个不同 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 是一个很好的工具,可以用来测试一切是否正常以及您是否得到了所需的响应。

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

【讨论】:

您好,感谢分享,您有机会提供 ADFS 端的屏幕截图吗?努力让这个工作。我不敢相信我已经为此奋斗了多久。由于 AWS 有一篇很棒的博客文章,因此在与控制台集成方面是一个灌篮高手。在 Cognito 用户池上没有那么多。谢谢! 我这边也有同样的问题。您知道您需要特别截屏的部分吗?什么对你不利?

以上是关于使用 AWS Cognito 和 AD FS 作为 Web 应用程序的身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何继续使用适用于 AWS Cognito 的 AD FS SAML?

如何将 AD FS 组成员身份映射到自定义 AWS Cognito 属性?

将 Microsoft(个人和工作 Azure AD)OIDC 集成到 AWS Cognito

AWS Amplify SPA React + Cognito(已启用 Microsoft Azure Ad Enterprise SSO)+ Microsoft Graph API

由于错误 AccessDeniedException(Lambda 别名作为 Cognito 触发器),AWS Cognito 用户池引发 PreSignUp 调用失败

Cognito 用户池作为具有客户端凭据的身份提供者仅在保存到 aws 控制台后才有效