将 Azure 身份验证连接到其他提供商,第 3 部分:将 Azure AD 与 AWS Cognito 连接以进行身份验证





5.00/5 (2投票s)
在本文中,我们将学习如何在多云环境中将 Azure AD 与 AWS Cognito 连接以进行身份验证。
企业越来越多地采用多云战略,以受益于更快的速度、更轻松的管理和更低的成本。尽管如此,这种战略需要一个集成的解决方案来提供统一的体验,而不是孤立的服务。 Microsoft Azure Active Directory (AD) 在多云环境中处理身份验证和授权更具挑战性的方面,而您可以专注于应用程序的其他方面。
本文演示了在 Spring Boot 应用程序中将 Amazon Web Services (AWS) Cognito 用户身份服务与 Azure 身份验证服务集成。该解决方案使用户能够使用任一身份服务访问应用程序。
要遵循本教程,您必须具备
- 一些 Java 经验
- 访问 Azure 云平台
- 访问 AWS 云平台
- 本系列第一篇文章中的 guestBook 应用程序,它为用户提供了一个基本的表单来输入他们的反馈
我们使用 Spring Boot、Spring MVC 和 Thymeleaf 框架构建了 guestBook 应用程序。以前,该应用程序是本地 AD 身份验证的一部分。在本系列第二篇文章中,我们为应用程序启用了社交登录。现在,我们配置同一个应用程序以集成 Microsoft 平台登录过程。
设置 AWS Cognito
Amazon Cognito 为 Web 和移动应用程序提供安全的用户身份验证、授权和用户管理。该服务提供以下类型的解决方案
- 用户池服务为应用程序用户提供注册和登录选项。
- 身份池服务授予他们访问其他 AWS 服务的权限。
让我们开始创建一个新的用户池,我们可以使用它来验证 guestBook 应用程序的用户。我们提供池名称,然后单击“审查默认设置”。
此操作将带我们到最后一步。
详细的工作流程提供了根据业务需求自定义用户池行为的机会。请查阅 Cognito 文档以了解有关这些属性的更多详细信息。
添加用户
现在我们有了用户池,我们必须添加一些用户进行身份验证。AWS Cognito 服务提供了一个管理控制台来添加用户,但该控制台不提供添加用户属性(如姓名)的功能。
或者,AWS 命令行界面 (CLI) 提供了添加或更新用户及其属性信息的命令。请参阅 CLI 文档进行安装。
安装后,我们必须使用我们的 AWS 帐户凭据配置 CLI。
$ aws configure
现在我们可以使用 cognito-idp
命令和 admin-create-user
子命令添加用户,如下所示。请务必将 pool-id
替换为正确的 ID。
$ aws cognito-idp admin-create-user --user-pool-id us-east-2_XXXX --username gsguest --user-attributes Name="given_name",Value="GS" --user-attributes Name="name",Value="GS Guest"
我们可以使用 Cognito 管理控制台验证用户。
添加应用程序客户端
客户端 ID 和密钥控制对 AWS Cognito 用户池的访问。我们需要这些凭据来集成 Azure AD。
通过提供合适的名称来添加应用程序客户端。
配置 OAuth
Cognito 使用 OAuth 2.0 框架提供用户身份验证。该框架提供对它可以与请求应用程序共享的详细信息的验证。我们通过选择支持的 OAuth 范围来启用此验证功能。为此,我们移动到应用程序客户端控制台以提供应用程序客户端所需的范围。
请务必选择email、profile 和 openid。另外,为启用的身份提供者选择Cognito 用户池。
此外,我们必须指定一个基于 Azure 租户的 URL 来接受经过验证的令牌。该 URL 是
https://gswebcognito.b2clogin.com/gswebcognito.onmicrosoft.com/oauth2/authresp
请务必将名称替换为您 Azure B2C 租户的名称。当 Azure B2C 租户可用时,您可以执行此步骤。
Azure 向托管在 AWS 子域或自定义域上的 AWS Cognito 池提交请求以验证用户。我们必须在应用程序集成下的域名管理控制台上配置这些详细信息。
添加 Azure 身份验证
Azure AD 支持基于 OpenID Connect (OIDC) 集成第三方身份提供者。OIDC 框架使用 OAuth 2.0,它将用户身份验证委派给托管用户帐户的服务提供商。此外,服务提供商必须授权第三方应用程序访问用户详细信息。通过这种方式,OAuth 2.0 创建了一个单一框架,用于在单个、统一的体系结构中保护移动应用程序和浏览器应用程序的 API。
创建 B2C Azure Active Directory
要通过 OIDC 进行集成,我们需要一个 B2C Azure AD。在继续之前,请确保您的帐户具有有效订阅。然后,我们可以创建一个 B2C Azure AD。
通过单击Azure Active Directory > 管理租户 > 创建租户来创建新租户。
新租户出现在切换租户页面上。
单击切换以使用该租户。
接下来,通过将应用程序页面移动到注册并单击新注册来创建应用程序凭据。提供一个名称,并选择任何组织目录中的帐户和个人 Microsoft 帐户作为帐户类型。
提交后,页面将显示客户端 ID 和租户 ID 详细信息。
应用程序凭据还需要客户端密钥,因此请移至 gsWeb 应用程序的证书和密钥区域。单击新密钥为项目生成一个密钥。
在 gsWeb 应用程序中,将令牌返回 URL 指定为 https://:8080/login/oauth2/code/。此 URL 是 Java 应用程序中的令牌返回路径。
如果您使用域名部署应用程序,请相应地更改路径。另外,请同时选择访问令牌和 ID 令牌进行身份交换。
Azure 平台还使我们能够从浏览器验证此第三方平台集成。验证会将令牌提交给 JWT 服务,例如 http://jwt.ms。该服务将呈现令牌详细信息。
因此,将 http://jwt.ms 添加到返回 URL 列表中。
集成 OIDC
Azure 平台使我们能够集成各种身份提供者来进行用户身份验证。它具有流行的社交服务的开箱即用连接器,并与支持 OIDC 的任何身份服务进行接口。由于我们在本应用程序中启用了 AWS Cognito 登录,因此我们必须创建一个 OIDC 提供者。
提供者要求以下详细信息
- 名称:可以是任何逻辑名称。
- 元数据 URL:提供有关 OIDC 服务的信息。AWS Cognito 以以下格式为每个用户池提供 URL:https://cognito-idp.ZONE.amazonaws.com/COGNITO_POOL_ID/.well-known/openid-configuration。请务必替换区域和 Cognito 池 ID 详细信息。
- 客户端 ID:为 AWS Cognito 应用程序客户端生成的客户端 ID。
- 客户端密钥:为 AWS Cognito 应用程序客户端生成的密钥。
- 范围:应为 OpenID email profile。
- 域名:为 AWS Cognito 创建的域名映射。
- 声明映射:OpenID 提供的详细信息的映射。OpenID 将用户 ID 映射到
sub
,显示名称映射到name
,名字映射到given_name
,姓氏映射到surname
。
创建用户流
创建身份提供者后,您必须启用特定于应用程序的数据流。在 gsWeb 应用程序中,您只需要注册和登录流,因此单击用户流并使用建议的配置创建一个流。对话框将询问以下附加详细信息
- 名称:流的逻辑名称。
- 帐户:选择无以禁止在 AD 中创建的任何用户。
- 身份提供者:选择新添加的 OIDC 提供者。
- 用户属性:请务必为名字选择返回声明复选框,因为该属性位于返回到应用程序的令牌中。
验证集成
如前所述,Azure 平台使我们能够验证集成。
为此,请打开新创建的用户流。平台将提供运行流的选项。该操作将打开一个对话框来选择返回 URL。选择应用程序以及我们添加到应用程序返回 URL 的 http://jwt.ms URL。
单击运行。然后,浏览器将打开一个对话框,用于提供 AWS Cognito 用户帐户的凭据。
集成应用程序
现在我们已经验证了 Azure AD 配置,剩下的就是将 guestBook 应用程序与 AD 集成。要配置应用程序中的身份验证,我们必须添加 Azure AD B2C 的依赖项。
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
<version>3.9.0</version>
</dependency>
Spring Boot starter 需要以下附加参数才能连接到正确的 Azure AD
Base-URI
:每个 B2C AD 都有一个标识 AD 的基本 URL。Client-id
:Azure AD 应用程序注册生成的客户端 ID。Client-secret
:与 Azure AD 应用程序注册关联的客户端密钥。User-flows
:在 Azure AD 中创建的用户流的名称。
您必须在 src/main/resources 文件夹下的 application.properties 文件中提供上述参数,如下所示
# Azure AD properties
azure.activedirectory.b2c.base-uri: https://gswebcognito.b2clogin.com/gswebcognito.onmicrosoft.com/
azure.activedirectory.b2c.client-id: e545f841-3c93-4944-976e-32bff5b9baa2
azure.activedirectory.b2c.client-secret: XXXXX~1pAB9gwWyz7XXXXXXXXXXXXXX
azure.activedirectory.b2c.user-flows.sign-up-or-sign-in: B2C_1_cognito
获取用户详细信息
我们必须使用安全注解 EnableWebSecurity
来启用身份验证。此外,最好将该注解应用于 SecurityConfig
类。该类允许我们根据应用程序需求自定义和微调安全性。
@EnableWebSecurity
public class AADOAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
private final AADB2COidcLoginConfigurer configurer;
public AADOAuth2LoginSecurityConfig(AADB2COidcLoginConfigurer configurer) {
this.configurer = configurer;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.apply(configurer)
;
}
}
上述集成生成 OAuth2AuthenticationToken
,它可以读取 OAuth2 详细信息。此配置对所有请求都启用。因此,您可以修改 GET
请求以从 Principal 读取用户名,而不是询问用户
@GetMapping({"/"})
public String loadBookEntry(Model model, OAuth2AuthenticationToken principal) {
BookEntryDTO dto = new BookEntryDTO();
dto.setName(principal.getPrincipal().getAttributes().get("name").toString());
model.addAttribute("bookentry", dto);
return "bookentry";
}
现在,启动应用程序并访问其 URL。该应用程序使用基于 Microsoft 的身份验证。您可以使用您的 Outlook.com 或 Skype 凭据登录。
后续步骤
您现在知道如何将 Azure AD 与 OIDC 框架无缝集成。Azure Spring Boot 库通过约定优先的默认值提供简洁的集成。该库消除了集成相关的挫败感,同时提供了根据需要进行修改的能力。开发人员可以专注于他们的业务流程,而将所有样板集成留给 Azure AD 和相关的 Spring Boot starter 库。
通过要求登录,您使您的应用程序及其数据更加安全。您还为在多云环境中访问应用程序的用户提供了无缝的体验。将 Azure AD 添加到现有应用程序与添加到新应用程序一样简单,并且 Azure AD 与现有的企业身份验证和单点登录 (SSO) 解决方案配合良好,因此您可以应用这些方法来增强所有应用程序。
既然您知道如何通过 OICD 将 Azure AD 与本地 AD、社交登录和 AWS 集成,您就可以为您的应用程序添加强大的身份验证,无论其体系结构如何,同时提供无缝的用户体验。继续创建您激动人心的新 Java 应用,将其部署到 Azure,并添加 Azure AD 身份验证以保护您的应用程序数据并提供个性化的用户体验。
要了解有关 Azure Active Directory (Azure AD) 演进的更多信息,请查看Azure 开发人员指南。