使用 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 调用失败