使用 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 个组成部分:
- 具有联合身份提供商的 AWS Cognito 用户池
- Windows 安装了 AD FS 的服务器
创建 Cognito 用户池域
在 常规设置、select App 客户端 下的 Cognito 用户池中,如果有 [=182],则添加一个=](稍后您将需要 ID)。
然后转到应用程序集成下的域名并选择一个有效的域名前缀并保存。
依赖方信任 Windows AD FS
您需要让公司建立信赖方信托。所需步骤如下:
- 打开 AD FS 管理控制台
- 创建新的信赖方信任
- Select 手动输入详细信息
- 为信任输入一个易于识别为您的应用程序的名称
- Select 使用 ADFS 2.0
- 在这个例子中,不需要证书所以直接点击下一步
- Select复选框启用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 中
- 根据需要填写table。一个要求是你有一个 Name ID 被返回(我通常使用 User-Principal-Name 映射到 Name ID )。 table 的其余部分是您需要的。例如,Given-Name 可以映射到 FName
AWS Cognito 用户池中的联合身份
因此,作为应用程序开发人员,您需要设置 Cognito 用户池。通过向导并选择您喜欢的设置。无论如何,联合身份不一定遵循与用户池本身相同的规则。
设置联合身份的步骤是:
- 在 Cognito 用户池 select Identity Providers 下 Federation
- 点击 SAML
- 提供元数据文档端点(通常采用
https://<fqdn>/FederationMetadata/2007-06/FederationMetadata.xml
的形式)。如果您不能下载该文件并通过单击“Select 文件” 上传它
- 输入对您有意义的提供商名称,但确保名称中不要包含任何空格
- 标识符是可选的(请参阅下面的用法)
- 选中启用 IdP 注销流程将使您的用户退出其联合身份以及您的应用程序。
- 点击创建供应商
联合身份的属性映射
- 通过转到用户池中 Federation 下的 Attribute Mapping 创建联合身份的字段映射。
- Select SAML
- 单击添加 SAML 属性
- 确保选中捕获,输入上面的 SAML 属性(例如 FName)和 select 它映射到的用户池属性。
设置应用客户端
测试前的最后一步是设置您之前创建的应用程序客户端。
- 转到应用程序集成
下的应用程序客户端设置
- 输入相应应用程序客户端的设置
- Select 所有适当的身份提供者(特别是上面的设置)
- 您可以设置以逗号分隔的回调和注销列表 URL。回调 URLs 应该指向将在身份验证后使用令牌的某个地方(请参阅下面的测试)。
- Select OAuth 2.0 属性是必需的,但用于测试 select 除 客户端凭据
之外的所有内容
测试
要进行测试,您可以尝试几个不同的 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 是一个很好的工具,可以用来测试事情是否正常运行以及您是否获得了所需的响应。
我希望这对其他人有帮助。
我们目前正在 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 个组成部分:
- 具有联合身份提供商的 AWS Cognito 用户池
- Windows 安装了 AD FS 的服务器
创建 Cognito 用户池域
在 常规设置、select App 客户端 下的 Cognito 用户池中,如果有 [=182],则添加一个=](稍后您将需要 ID)。
然后转到应用程序集成下的域名并选择一个有效的域名前缀并保存。
依赖方信任 Windows AD FS
您需要让公司建立信赖方信托。所需步骤如下:
- 打开 AD FS 管理控制台
- 创建新的信赖方信任
- Select 手动输入详细信息
- 为信任输入一个易于识别为您的应用程序的名称
- Select 使用 ADFS 2.0
- 在这个例子中,不需要证书所以直接点击下一步
- Select复选框启用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 中
- 根据需要填写table。一个要求是你有一个 Name ID 被返回(我通常使用 User-Principal-Name 映射到 Name ID )。 table 的其余部分是您需要的。例如,Given-Name 可以映射到 FName
AWS Cognito 用户池中的联合身份
因此,作为应用程序开发人员,您需要设置 Cognito 用户池。通过向导并选择您喜欢的设置。无论如何,联合身份不一定遵循与用户池本身相同的规则。
设置联合身份的步骤是:
- 在 Cognito 用户池 select Identity Providers 下 Federation
- 点击 SAML
- 提供元数据文档端点(通常采用
https://<fqdn>/FederationMetadata/2007-06/FederationMetadata.xml
的形式)。如果您不能下载该文件并通过单击“Select 文件” 上传它
- 输入对您有意义的提供商名称,但确保名称中不要包含任何空格
- 标识符是可选的(请参阅下面的用法)
- 选中启用 IdP 注销流程将使您的用户退出其联合身份以及您的应用程序。
- 点击创建供应商
联合身份的属性映射
- 通过转到用户池中 Federation 下的 Attribute Mapping 创建联合身份的字段映射。
- Select SAML
- 单击添加 SAML 属性
- 确保选中捕获,输入上面的 SAML 属性(例如 FName)和 select 它映射到的用户池属性。
设置应用客户端
测试前的最后一步是设置您之前创建的应用程序客户端。
- 转到应用程序集成 下的应用程序客户端设置
- 输入相应应用程序客户端的设置
- Select 所有适当的身份提供者(特别是上面的设置)
- 您可以设置以逗号分隔的回调和注销列表 URL。回调 URLs 应该指向将在身份验证后使用令牌的某个地方(请参阅下面的测试)。
- Select OAuth 2.0 属性是必需的,但用于测试 select 除 客户端凭据 之外的所有内容
测试
要进行测试,您可以尝试几个不同的 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 是一个很好的工具,可以用来测试事情是否正常运行以及您是否获得了所需的响应。
我希望这对其他人有帮助。