使用Spring Boot + Azure AD B2C来实现身份验证

使用Spring Boot + Azure AD B2C来实施认证

之前的文章提到了 Azure 向导的 Spring Boot Starter,现在我想解释一下如何使用 Azure Active Directory B2C 的库进行身份验证。除此之外,还有一些其他库,我希望在另一篇文章中解释。

Azure专用的Spring Boot入门 | Microsoft文档

Azure Active Directory B2C 需要将原生语言转化为中文,只需要一种选项:

Azure 租户 B2C

Azure AD B2C 是为 B2C 客户提供认证和身份管理等服务的服务,被称为所谓的 IDaaS(身份管理即服务)。

Azure Active Directory B2C 是一种身份验证服务,由 Microsoft 提供。

在详细讨论之前,请收集相关文件。您可以通过与社交账户关联或使用任何邮件地址进行注册、登录、以及进行个人资料管理等操作。B2C可以免费使用一定数量的用户。在本文中,我们不会重点讨论B2C本身,请参考以下内容进行创建。

创建Azure Active Directory B2C租户的教程 | Microsoft文档

Spring Boot使用Azure AD B2C库。

目前, azure-spring-boot-starter-active-directory-b2c:3.3.0 是最新版本。由于版本已经升级到3.0系列,并且之前的库名已更改为azure-active-directory-b2c-spring-boot-starter,请注意。在搜索时可能会遇到旧的教程,并且配置细节可能略有不同。

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
    <version>3.3.0</version>
</dependency>

请使用 https://start.spring.io/ 从头开始创建一个Spring Boot项目,选择Web、Azure Active Directory、Thymeleaf和Security作为依赖关系。

最终需要以下的依赖关系。为了在View层使用自定义标签,我们添加了thymeleaf-extras-springsecurity5,但本文不对此进行解释。请查看最后介绍的GitHub示例的View。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.azure.spring</groupId>
            <artifactId>azure-spring-boot-starter-active-directory</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        </dependency>

所需配置

我们将进行以下的B2C设置。

应用程序的注册

注册认证应用程序信息。如果不需要部署特别的话,只需要将重定向URL设置为http://localhost:8080/login/oauth2/code/就可以了。

我应该能够获取到以下的信息。

    • テナントサーバーのURL

 

    • クライアントID

 

    クライアントシークレット

用户流程

在B2C业务中,我们需要事先定义好用户登录和注册的流程。已经事先定义好的流程被称为”用户流程”,基于通用场景几乎都已经准备好了,您也可以进行一定程度的定制,这样非常方便。另外,我们还可以进行详细定制,但在这里不做具体介绍,如果您感兴趣的话,请自行查阅。

在B2C平台上定义用户流程,将以下三个流程定义并命名保存。

    • サインイン、サインアップ フロー名

 

    • プロファイル編集 フロー名

 

    パスワードリセット フロー名(任意)

适用于Spring Boot Starter的配置

由于Spring Boot Starter为我们提供了配置,所以我们可以通过设置以下属性来设置前面提到的信息。

azure:
  activedirectory:
    b2c:
      base-uri: ${your-tenant-authorization-server-base-uri}
      client-id: ${your-client-id}
      client-secret: ${your-client-secret}
      logout-success-url: ${you-logout-success-url}
      user-flows:
        password-reset: B2C_1_reset_password
        profile-edit: B2C_1_edit_profile
        sign-up-or-sign-in: B2C_1_signin
      user-name-attribute-name: ${your-user-name-attribute-name}

应用程序的实现

在继承了WebSecurityConfigurerAdapter类的类中定义了要在哪个页面上设置认证。在下面的代码中,除了/login页面外,其他页面都被定义为需要认证,但请根据需要进行修改。

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    private final AADB2COidcLoginConfigurer configurer;

    public WebSecurityConfiguration(AADB2COidcLoginConfigurer configurer) {
        this.configurer = configurer;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
            .apply(configurer);
    }
}

我们还会准备一个控制器和页面,但在这里省略掉。

当你在控制器的参数中指定了OAuth2AuthenticationToken,它就会被自动注入,这样你就可以从中获取认证信息。以下是一个简单的示例。

    private void initializeModel(Model model, OAuth2AuthenticationToken token) {
        if (token != null) {
            final OAuth2User user = token.getPrincipal();

            model.addAllAttributes(user.getAttributes());
            model.addAttribute("grant_type", user.getAuthorities());
            model.addAttribute("name", user.getName());
        }
    }

    @GetMapping(value = { "/", "/home" })
    public String index(Model model, OAuth2AuthenticationToken token) {
        initializeModel(model, token);
        return "home";
    }

执行,确认 (zhí , què

运行 ‘mvn clean spring-boot:run’ ,在本地访问 http://localhost:8080 ,将重定向到B2C的登录页面。

如果要将WebApps部署到B2C上,我认为只需正确设置重定向URL,然后进行部署即可使其运作。

image.png

总结

只需要提供一个选项:

使用B2C可以轻松进行认证,但需要理解B2C的设置等等,只要解决了这一点,就可以轻松实施认证。以前更加麻烦,所以提供库是很好的。在定制方面,也可以确认如何为B2C进行实施。

请参考以下SDK页面,在最后可以找到样本。

Azure SDK for Java的azure-spring-boot-sample-active-directory-b2c-oidc示例位于azure-sdk-for-java/sdk/spring/azure-spring-boot-samples/azure-spring-boot-starter-active-directory-b2c_3.3.0项目中。

广告
将在 10 秒后关闭
bannerAds