65.9K
CodeProject 正在变化。 阅读更多。
Home

将 Azure 身份验证连接到其他提供商,第 2 部分:使用 Azure AD B2C 实现社交登录

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (3投票s)

2022年1月10日

CPOL

7分钟阅读

viewsIcon

8400

downloadIcon

59

在本文中,我们将学习如何使用 Azure AD 进行社交登录。

如今,许多公司都提供面向消费者的应用程序,而用户为每个应用程序都创建一个全新的登录帐户会非常麻烦。您可以允许用户使用他们的社交帐户(如 Google、Facebook、Microsoft 和 GitHub)登录,从而为您的客户提供便利。Microsoft 负责处理授权和身份验证方面最棘手的部分,而您可以专注于寻找更多方式来增强应用程序的用户体验。

本文演示了如何在 Spring Boot 应用程序中为社交帐户设置 Azure Active Directory (AD) 身份验证。要继续学习本教程,您必须拥有

  • 一些 Java 经验
  • 对 Azure 云平台的访问权限
  • Outlook.com 或 Skype 帐户
  • 本系列第一篇文章中的guestBook 应用程序,该应用程序提供了一个基本表单供用户输入反馈。

我们使用 Spring Boot、Spring MVC 和 Thymeleaf 框架构建了该应用程序。该应用程序是本地 AD 身份验证过程的一部分。现在,我们将配置同一个应用程序以集成 Microsoft 平台登录过程。

添加 Azure 身份验证

Azure AD 为集成 Google、Facebook、GitHub 以及 Microsoft 等第三方社交平台提供了丰富的支持。该过程提供了快速便捷的用户注册,无需繁琐的注册流程。因此,该业务流程为客户提供了便利,同时也为入职流程增加了用户身份验证。

设置 B2C Active Directory

我们需要一个面向消费者的 (B2C) Azure Active Directory (AD) 来将我们的应用程序与社交平台集成。与普通 Azure AD 不同,B2C 版本不是免费的,需要订阅。

首先,请确保您的 Azure 帐户已关联到可用的订阅。打开“订阅”视图以验证模型或添加新模型。

在有了订阅后,我们就可以创建一个 B2C Azure AD。

首先,通过单击“Azure Active Directory”>“管理租户”>“创建租户”来创建一个新租户。填写“组织名称”、“初始域名”和“国家/地区”字段,然后单击“创建”以添加新租户。

新创建的租户会显示在“切换租户”页面上。选择该租户并单击“切换”以使用该租户。

我们必须使用新创建租户的详细信息配置 Spring Boot 应用程序。因此,请转到新 AD 租户下的“应用程序注册”区域,并创建一个新注册。提供一个“名称”,然后选择“任何组织目录中的帐户和个人 Microsoft 帐户”作为帐户类型。

提交后,控制台将显示客户端 ID 和租户 ID 详细信息。现在,我们必须为应用程序凭据提供客户端密码。

转到 gsWeb 应用程序中的“证书和密码”区域。然后,单击“新建密码”以生成客户端密码。

Azure AD 会将 JSON Web 令牌 (JWT) 返回到 Spring 应用程序。因此,我们指定应用程序的令牌交换类型和位置。

我们在 guestBook 应用程序中定义了一个 Web 应用程序,并将令牌返回 URL 设置为https://:8080/login/oauth2/code/。我们将此令牌的返回路径放在 Java 应用程序中以使用已身份验证的令牌。由于我们在本地主机上部署应用程序,因此返回令牌路径为https://:8080。如果您将应用程序部署在域名上,请务必相应地更改位置。

此外,我们使用同一个应用程序进行 Azure AD 和社交平台之间的基于 OpenID 的令牌交换。因此,我们必须指定一个基于租户的 URL(https://guestbooksocial.b2clogin.com/guestbooksocial.onmicrosoft.com/oauth2/authresp),以接受来自社交平台的已验证令牌。请确保将名称替换为您自己的 B2C 租户名称。

Azure 平台还允许我们从浏览器中验证此第三方平台集成。验证过程会将令牌提交给 JWT 服务,例如http://jwt.ms。然后,该服务将呈现令牌详细信息。因此,将http://jwt.ms添加到返回 URL 列表。另外,请确保选择 ID 令牌和访问令牌以获取身份信息。

集成身份提供商

Azure 平台允许我们与大多数流行平台(包括 Facebook、Google、Twitter 和 Outlook)进行接口。

让我们在 Azure AD 租户中启用每个平台的集成。由于我们希望在此应用程序中允许登录 Outlook 和 Skype,因此添加一个 Microsoft 提供商。该提供商需要以下详细信息:

  • 名称:提供一个有意义的名称。
  • 客户端 ID:提供上面执行的应用注册的客户端 ID。
  • 客户端密码:提供为 Azure 应用生成的密码。

启用用户流

创建身份提供商后,我们必须启用应用程序特定的数据流。这些数据流允许用户执行多种操作,包括注册、登录、配置文件编辑和密码重置。

在 guestBook 应用程序中,我们只需要一个注册和登录流,因此单击“用户流”并使用建议的配置创建一个流。对话框还会询问以下详细信息:

  • 名称:为流使用一个有意义的名称。
  • 帐户:选择“”以禁止在 AD 中创建的任何用户。
  • 身份提供商:选择新添加的 Microsoft 身份提供商。
  • 用户属性:请确保为“名字”选择“返回声明”复选框,因为该属性在返回到应用程序的令牌中。

验证集成

如前所述,Azure 平台允许我们验证集成。

为此,请打开新创建的用户流。它会显示一个运行流的选项。此操作会打开一个对话框,要求您选择返回 URL。选择应用程序和我们添加到应用返回 URL 的http://jwt.ms URL。

单击“运行”,浏览器将打开一个对话框,要求您提供 Microsoft 平台帐户的凭据。用户验证后,它将返回 JWT 访问令牌并在 jwt.ms 控制台中显示。

集成应用程序

现在我们已经验证了 Azure AD 配置,剩下的是将 guestBook 应用程序与 AD 集成。我们添加 Azure B2C AD 的依赖项以在应用程序中配置身份验证。

<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

  • 基础 URI:每个 B2C AD 都有一个标识 AD 的基本 URL。
  • 客户端 ID:Azure AD 应用程序注册生成的客户端 ID。
  • 客户端密码:与 Azure AD 应用程序注册关联的客户端密码。
  • 用户流:我们在 Azure AD 中创建的用户流的名称。

我们必须在src/main/resources文件夹的application.properties文件中提供这些参数,如下所示:

# Azure AD properties
azure.activedirectory.b2c.base-uri: https://guestbooksocial.b2clogin.com/guestbooksocial.onmicrosoft.com/
azure.activedirectory.b2c.client-id: 3b94308a-fb95-4944-a5ec-e7536ecfb341
azure.activedirectory.b2c.client-secret: XXXXXX~XXXXXDni7LG_HUxWSVcG2Bn
azure.activedirectory.b2c.user-flows.sign-up-or-sign-in: B2C_1_gswebflow

获取用户详细信息

我们通过安全注解 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)
       ;
   }
}

上面的适配器使用默认的重定向 URI(/login/oauth2/code/)。我们也可以通过指定属性 azure.activedirectory.redirect-uri-template 和配置 OAuth 处理位置来定制此适配器。

上面的集成将生成 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 B2C 无缝集成社交平台。该集成支持 Facebook、Twitter、Microsoft 和 GitHub 等多个平台。我们可以将身份交换用于注册和登录之外的用例。我们可以对其进行自定义以满足业务需求。

此外,Azure Spring Boot 库提供了与约定优于配置的默认值简洁的集成。它消除了集成相关的麻烦,同时允许我们根据需要进行修改。开发人员可以专注于他们的业务流程,而将样板集成留给 Azure AD 和相关的 Spring Boot starter 库。

当您使用 Azure AD 将社交登录集成到您的应用程序中时,您的用户将享受更简单的登录体验,同时避免设置另一个新帐户。与此同时,强制登录有助于保护您的应用程序及其数据,同时使您能够为每个用户个性化客户体验。

继续阅读本系列的第三篇文章,了解 如何在多云环境中将 Azure AD 与 AWS Cognito 连接以进行身份验证。

要了解有关 Azure Active Directory (Azure AD) 演进的更多信息,请查看Azure 开发人员指南

© . All rights reserved.