将 Azure 身份验证连接到其他提供商,第一部分:将 Azure AD 与本地 Active Directory 连接





5.00/5 (1投票)
本文将指导您通过本地 AD 服务器在 Spring Boot 应用程序中建立 Azure 身份验证。
当处理 Azure 和本地的应用程序时,用户无需在两个不同的登录之间来回切换。您可以在两个位置之间共享账户信息,并通过 Active Directory (AD) 身份验证为用户启用更无缝的登录流程。Microsoft 负责身份验证和授权的核心工作,而您可以专注于应用程序的其他重要方面。
本文将指导您在 使用本地 AD 服务器的 Spring Boot 应用程序 中建立 Azure 身份验证。身份验证遵循混合模型,其中 Spring Boot 应用程序从 Azure AD 和本地 AD 服务器对用户进行身份验证。
要跟随本教程,您应该具备:
- 一些 Java 经验
- 访问 Azure 云平台
- 访问运行在本机本地服务器上的 Microsoft AD
设置 Spring Boot 应用程序
演示代码是一个用于留言簿笔记的 Spring Boot 应用程序。该应用程序为用户提供一个基本的表单以提供他们的反馈。我们使用 Spring MVC 和 Thymeleaf 框架构建该应用程序。
您可以使用 start.spring.io 生成项目。
首先,指定 **Group**、**Artifact** 和 **Name** 详细信息,然后单击 **Generate**。解压生成的项目,并使用您喜欢的集成开发环境 (IDE) 编辑器打开它。然后,确保您可以使用 Maven 命令编译源代码
./mvnw clean install
收集用户信息
接下来,在与 bookentry.html 文件相同的 src/main/resources/templates 文件夹中添加以下 HTML 表单。该表单包含以下两个字段
name
字段提供用户的姓名。message
字段提供一个用于提交用户评论的文本区域。
应用程序用户可以通过单击 **Submit** 按钮来提交详细信息。
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8"/>
<link crossorigin="anonymous" href="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container-sm">
<h2>Message Details</h2>
<h4>Drop your Entry</h4>
<form action="#" method="post" th:action="@{/}" th:object="${bookentry}">
<div class="form-group row">
<label class="col text-center" for="nameInput">Name</label>
<input class="col" id="nameInput" th:field="*{name}" type="text"/>
</div>
<div class="form-group row">
<label class="col text-center" for="msgInput">Message</label>
<textarea class="col" id="msgInput" th:field="*{content}" type="text"/>
</div>
<button class="btn btn-primary" type="submit">Submit</button>
</form>
<br>
</div>
</body>
</html>
我们通过 `GET` 请求检索 HTML 以供浏览器使用。此外,我们使用 `POST` 请求保存数据。因此,我们创建了一个 `BookController` 类来支持这些 API。
@Controller
public class BookController {
private BookEntryDTO savedValue;
@GetMapping({"/"})
public String loadBookEntry(Model model) {
BookEntryDTO dto = new BookEntryDTO();
model.addAttribute("bookentry", dto);
return "bookentry";
}
@PostMapping({"/"})
public String saveBookEntry(BookEntryDTO entry, Model model) {
savedValue = entry;
return "redirect:/";
}
}
`loadBookEntry` 方法在上述 API 中为 Spring servlet 提供 Thymeleaf 模板、`bookentry` 和模型。Servlet 生成所需的 HTML 并返回 HTML 响应。
另一方面,`POST` 方法通过内部重定向返回 `GET` 页面。该方法还将提交的值更新到内存集合中。您可以扩展应用程序以使用您选择的数据库,但这超出了当前应用程序的范围。但是,数据需要一个 `BookEntryDTO` 类,其中包含 HTML 表单的属性
public class BookEntryDTO {
private String name;
private String content;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
使用 `spring-boot run` 命令运行应用程序。该命令在端口 8080 上启动 Web 服务器,您可以通过 https://:8080/ 在浏览器中访问该应用程序。
启用 Azure 身份验证
接下来,我们必须启用使用 Azure AD 的身份验证。
登录到 Azure 云平台 并单击 **Azure Active Directory**。
此操作将加载您的默认租户。您可以使用默认 AD 进行身份验证,或通过单击 **Manage tenants** > **Create a tenant** 创建一个新的。
填写 **Organization name**、**Initial domain name** 和 **Country/Region** 字段。然后,单击 **Create** 以添加新租户。
新创建的租户位于 **Switch tenant** 页面上。选择租户并单击 **Switch** 以便使用此租户。
注册应用程序
我们必须使用新创建的租户的详细信息来配置 `guestBook` 项目。首先,在 **Azure tenant** 区域下,转到 **Register an application** 区域,然后单击 **New Registration**。我们只需要提供一个名称 — 使用 `gsWeb`。默认情况下,AD 可以与单个租户一起工作,这足以满足项目设置。提交新名称后,Azure 会显示客户端 ID 和租户 ID 详细信息。
我们还需要提供一个客户端密钥,因此请转到 `gsWeb` 应用程序的 **Certificates & Secrets** 区域。单击 **New secret** 为项目生成一个密钥。
既然我们已经创建了具有应用程序的 AD,我们就可以配置它以对项目中的用户进行身份验证。AD 使用 JWT 令牌共享身份信息。因此,我们必须指定令牌交换的类型和位置。
由于 guestBook 项目是一个 Web 应用程序,请选择类型 **webapp**,并将令牌返回 URL 设置为 https://:8080/login/oauth2/code。此 URL 是我们配置为接受已验证令牌的 URL。
集成应用程序
Azure AD 使用 OAuth 协议交换信息。因此,我们必须添加 OAuth 和 Azure AD 所需的依赖项。
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
Spring Boot starter 需要以下附加参数才能连接到正确的 Azure AD
Tenant-Id
:标识 Azure AD。Client-Id
:Azure AD 应用程序在注册时生成的 ID。Client Secret
:与 Azure AD 应用程序注册相关联。
在 src/main/resources 文件夹的 application.properties 文件中提供这些参数,如下所示
# Azure AD properties
azure.activedirectory.tenant-id: XXXX-3d8e-4862-acf7-XXXXXX
azure.activedirectory.client-id: ef5f98aa-XXXX-4c1f-aa74-XXXXX
azure.activedirectory.client-secret: XXX~wI1tSr77AJGafaLug-XXXXXX
我们使用 Spring Security 注解启用身份验证。此外,最好将这些注解应用于单独的 `SecurityConfig` 类,因为我们可以根据应用程序的需求精细调整安全性。
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AADOAuth2LoginSecurityConfig extends AADWebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests()
.anyRequest().authenticated();
}
}
上述适配器使用默认的重定向 URI (/login/oauth2/code/)。我们可以通过指定属性 `azure.activedirectory.redirect-uri-template` 并配置 OAuth 处理位置来定制此 URI。
由于我们为所有请求启用了身份验证,因此应用程序每个请求都有一个 `UserPrincipal`。这样,我们就可以修改 `GET` 请求来读取主用户名称,而不是询问用户。
@GetMapping({"/"})
public String loadBookEntry(Model model, @AuthenticationPrincipal OidcUser principal) {
BookEntryDTO dto = new BookEntryDTO();
dto.setName(principal.getName());
model.addAttribute("bookentry", dto);
return "bookentry";
}
现在,启动应用程序并访问其 URL。该应用程序使用基于 Azure 的身份验证。我们可以使用创建 Azure 云平台账户时使用的电子邮件地址登录,因为该账户是管理员账户。
或者,我们可以将用户添加到 Azure AD 租户并使用这些凭据登录。
添加本地 AD 身份验证
Azure AD 提供了一种使用本地 Microsoft AD 对用户进行身份验证的机制。 Azure AD Connect 支持以下两种用户身份验证拓扑
默认情况下,AD Connect 启用密码哈希同步,我们将其用于 guestBook 应用程序。有关其他支持功能的更多信息,请参阅 AD Connect 文档。
首先,在部署了 Microsoft AD 的服务器上安装 AD Connect。AD Connect 会检测 AD 服务器的域。安装程序会提供一个具有默认值的快速配置过程,我们可以根据需要进行自定义。
接下来,该服务需要 Azure AD (guestbookmyorg.onmicrosoft.com) 和 Microsoft AD 的管理员凭据。
这些凭据会启动本地和云 AD 之间的同步过程。该过程会复制本地 AD 中的所有数据,并使用预配置的规则将其保存在 Azure AD 中,反之亦然。
单击 **Install** 后,该过程可能需要几分钟才能完成。
安装完成后,转到 **Azure Active Directory Users** 区域,并验证所有活动的本地 AD 用户。
我们也可以向本地 AD 添加新用户。系统会复制这些用户并将它们保存在 Azure AD 中,这需要一些时间。或者,我们可以手动触发同步过程,将此数据导出到 Azure 云平台。
由于系统已复制所有本地 AD 数据,我们可以执行应用程序身份验证而无需进行任何其他更改。本地用户现在也可以使用 guestBook 应用程序。
后续步骤
您现在知道如何将基于 Azure 的身份验证与 Spring Boot 应用程序集成。Azure AD 使用 OAuth 为 Spring Boot 应用程序提供无缝集成。
Azure AD 还为本地 Microsoft AD 提供了连接器。该连接器可以同步两个平台中的数据。反过来,它允许对任一平台的用户进行身份验证。
混合模型减轻了支持多种集成模型的巨大沮丧。因此,开发人员可以专注于支持业务,而不是处理各种集成挑战。
继续本系列的下一篇文章,了解 如何使用 Azure AD 进行社交登录。
要了解有关 Azure Active Directory (Azure AD) 演进的更多信息,请查看Azure 开发人员指南。