Ajouter la connexion avec Azure Active Directory B2C à une application web Spring

Cet article explique comment créer une application Java avec une fonctionnalité de connexion à l’aide de Spring Initializr avec Spring Boot Starter pour Microsoft Entra ID.

Dans ce tutoriel, vous allez apprendre à :

  • Créer une application Java à l’aide de Spring Initializr
  • Configurer Azure Active Directory B2C
  • Sécuriser l’application avec des classes et annotations Spring Boot
  • Générer et tester votre application Java

Microsoft Entra ID est la solution d’identité d’entreprise à l’échelle du cloud de Microsoft. Azure Active Directory B2C complète l’ensemble de fonctionnalités de Microsoft Entra ID, ce qui vous permet de gérer l’accès client, consommateur et citoyen à vos applications B2C (Business-to-Consumer).

Prérequis

Important

Spring Boot version 2.5 ou ultérieure est nécessaire pour effectuer les étapes décrites dans cet article.

Créer une application à l’aide de Spring Initialzr

  1. Accédez à https://start.spring.io/.

  2. Renseignez les valeurs conformément à ce guide. Les étiquettes et la disposition peuvent différer de l’image affichée ici.

    • Sous Project, sélectionnez Maven Project.
    • Sous Language, sélectionnez Java.
    • Sous Spring Boot, sélectionnez 2.7.11.
    • Sous Group, Artifact et Name, entrez la même valeur, à l’aide d’une chaîne descriptive brève. L’interface utilisateur peut automatiquement renseigner certains de ces champs lorsque vous tapez.
    • Dans le volet Dependencies, sélectionnez Add Dependencies. Utilisez l’interface utilisateur pour ajouter des dépendances envers Spring Web et Spring Security.

    Remarque

    Spring Security 5.5.1, 5.4.7, 5.3.10 et 5.2.11 ont été publié pour apporter une réponse au rapport CVE suivant CVE-2021-22119: Denial-of-Service attack with spring-security-oauth2-client. Si vous utilisez l’ancienne version, vous devez effectuer une mise à niveau.

  3. Sélectionnez Generate Project, puis téléchargez le projet à un emplacement sur votre ordinateur local. Déplacez le fichier téléchargé vers un répertoire nommé d’après votre projet, et décompressez le fichier. La disposition du fichier doit ressembler à ce qui suit, avec la valeur que vous avez entrée pour Group à la place de yourProject.

    .
    ├── HELP.md
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    └── src
        ├── main
        │   ├── java
        │   │   └── yourProject
        │   │       └── yourProject
        │   │           └── YourProjectApplication.java
        │   └── resources
        │       ├── application.properties
        │       ├── static
        │       └── templates
        └── test
            └── java
                └── yourProject
                    └── yourProject
                        └── YourProjectApplicationTests.java
    

Créer et initialiser une instance Microsoft Entra

Créer l’instance Azure Active Directory

  1. Connectez-vous à https://portal.azure.com.

  2. Sélectionnez Créer une ressource. Recherchez Azure Active Directory B2C.

    Créer une instance Azure Active Directory B2C avec le portail Azure.

  3. Sélectionnez Créer.

    Entrée dans la Place de marché Azure pour Azure Active Directory B2C.

  4. Cliquez sur Créer un nouveau client Azure Active Directory B2C.

    Option du portail Azure pour créer un locataire Azure AD B2C.

  5. Pour Nom de l’organisation et Nom de domaine initial, fournissez les valeurs appropriées, puis sélectionnez Créer.

    Écran permettant de créer un locataire Azure AD B2C.

  6. Une fois la création d’Active Directory terminée, sélectionnez votre compte dans le coin supérieur droit, sélectionnez Changer de répertoire, puis sélectionnez le répertoire créé. Vous êtes redirigé vers la page d’accueil du nouveau locataire. Recherchez ensuite b2c et sélectionnez Azure AD B2C.

    Rechercher le service Azure AD B2C.

Ajouter une inscription d’application pour votre application Spring Boot

  1. Dans le volet Gérer , sélectionnez Inscriptions d’applications, puis Nouvelle inscription.

    Capture d’écran du portail Azure montrant l’écran des inscriptions d’applications Azure AD B2C.

  2. Dans le champ Nom, entrez le nom de votre application, puis sélectionnez Inscrire.

    Formulaire d’inscription d’application Azure AD B2C.

  3. De retour dans le volet Gérer, sélectionnez Inscriptions d’applications, puis sélectionnez le nom de l’application que vous avez créée.

    Écran Inscriptions d’applications avec le nom complet sélectionné.

  4. Sélectionnez Authentification, Ajouter une plateforme, puis Web. Définissez les URI de redirection sur http://localhost:8080/login/oauth2/code/, puis sélectionnez Configurer.

    Options sélectionnées pour l’authentification : Ajouter une plateforme et Web.

    Écran Configurer web avec le champ URI de redirection sélectionné.

Ajouter des secrets d’application

Sélectionnez Certificats et secrets, puis Nouveau secret client. Entrez la description de votre secret, puis sélectionnez Ajouter. Après avoir créé le secret, sélectionnez l’icône de copie en regard de la valeur du secret pour copier la valeur. Vous en aurez besoin plus loin dans cet article.

Écran Ajouter un secret client.

Écran Certificats et secrets avec le bouton Copier sélectionné.

Remarque

Si vous quittez la section Certificats et secrets et revenez, vous ne pourrez pas voir la valeur du secret. Dans ce cas, vous devez créer une autre clé et la copier en vue d’une utilisation ultérieure. Parfois, la valeur générée du secret peut contenir des caractères qui sont problématiques pour l’inclusion dans le fichier application.yml, comme une barre oblique inverse ou une apostrophe inverse. Dans ce cas, ignorez ce secret et générez-en un autre.

Ajouter un flux d’utilisateur

  1. Accédez à la page principale de votre locataire. Dans la section Stratégies du volet gauche, sélectionnez Flux d’utilisateurs, puis Nouveau flux d’utilisateur.

  2. Vous quitterez maintenant ce didacticiel, exécutez un autre didacticiel et revenez à ce didacticiel lorsque vous avez terminé. Voici quelques éléments à prendre en compte quand vous passerez à l’autre tutoriel.

    • Commencez par l’étape qui vous invite à sélectionner Nouveau flux d’utilisateur.
    • Quand ce tutoriel fait référence à webapp1, utilisez à la place la valeur que vous avez entrée pour Group.
    • Lorsque vous sélectionnez des revendications à retourner à partir des flux, vérifiez que le nom complet est sélectionné. Sans cette revendication, l’application créée dans ce didacticiel ne fonctionnera pas.
    • Lorsque vous êtes invité à exécuter les flux utilisateur, l’URL de redirection que vous avez spécifiée précédemment n’est pas encore active. Vous pouvez toujours exécuter les flux, mais la redirection ne se termine pas correctement. Ceci est normal.
    • Quand vous atteignez « Étapes suivantes », revenez à ce tutoriel.

    Suivez toutes les étapes du tutoriel : Créer des flux utilisateur dans Azure Active Directory B2C pour créer des flux d’utilisateur pour « s’inscrire et se connecter », « modification de profil » et « réinitialisation de mot de passe ».

    Azure AD B2C prend en charge les comptes locaux ainsi que les fournisseurs d’identité sociale. Pour obtenir un exemple de création d’un fournisseur d’identité GitHub, consultez Configurer l’inscription et la connexion avec un compte GitHub à l’aide d’Azure Active Directory B2C.

Configurer et compiler votre application

Maintenant que vous avez créé l’instance Azure AD B2C et certains flux d’utilisateurs, vous allez connecter votre application Spring à l’instance Azure AD B2C.

  1. À partir de la ligne de commande, accédez au répertoire où vous avez décompressé le fichier .zip que vous avez téléchargé à partir de Spring Initializr.

  2. Accédez au dossier parent de votre projet, puis ouvrez le fichier de projet Maven pom.xml dans un éditeur de texte.

  3. Ajoutez les dépendances associées à la sécurité Spring OAuth2 au fichier pom.xml :

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
        <version>See Below</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <version>See Below</version>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        <version>See Below</version>
    </dependency>
    

    Pour spring-cloud-azure-starter-active-directory-b2c, utilisez la version la plus récente disponible. Vous pourrez peut-être utiliser mvnrepository.com pour la rechercher.

    Pour spring-boot-starter-thymeleaf, utilisez la version correspondant à la version de Spring Boot que vous avez sélectionnée ci-dessus, par exemple 2.3.4.RELEASE.

    Pour thymeleaf-extras-springsecurity5, utilisez la dernière version disponible. Vous pourrez peut-être utiliser mvnrepository.com pour la rechercher. À la date de rédaction de cet article, la version la plus récente est 3.0.4.RELEASE.

  4. Enregistrez et fermez le fichier pom.xml.

    • Vérifiez que vos dépendances sont correctes en exécutant mvn -DskipTests clean install. Si vous ne voyez BUILD SUCCESSpas, résolvez et résolvez le problème avant de continuer.
  5. Accédez au dossier src/main/resources de votre projet, puis créez un fichier application.yml dans un éditeur de texte.

  6. Spécifiez les paramètres pour l’inscription de votre application en utilisant les valeurs que vous avez créé précédemment ; par exemple :

    spring:
      cloud:
        azure:
          active-directory:
            b2c:
              enabled: true
              base-uri: https://<your-tenant-initial-domain-name>.b2clogin.com/<your-tenant-initial-domain-name>.onmicrosoft.com/
              credential:
                client-id: <your-application-ID>
                client-secret: '<secret-value>'
              login-flow: sign-up-or-sign-in
              logout-success-url: <your-logout-success-URL>
              user-flows:
                sign-up-or-sign-in: <your-sign-up-or-sign-in-user-flow-name> 
                profile-edit: <your-profile-edit-user-flow-name> 
                password-reset: <your-password-reset-user-flow-name> 
              user-name-attribute-name: <your-user-name-attribute-name> 
    

    Notez que la valeur client-secret est placée entre guillemets simples. Cela est nécessaire, car la valeur de <secret-value> contiendra probablement certains caractères qui doivent être placés entre des guillemets simples quand ils sont présents dans YAML.

    Remarque

    À la date de rédaction de cet article, la liste complète des valeurs d’intégration de Spring Active Directory B2C qui peuvent être utilisées dans application.yml est la suivante :

    spring:
      cloud:
        azure:
          active-directory:
            b2c:
              enabled: true
              base-uri:
              credential:
                client-id:
                client-secret:
              login-flow:  
              logout-success-url:
              user-flows:
                sign-up-or-sign-in:
                profile-edit: # optional
                password-reset: # optional
              user-name-attribute-name:
    

    Le fichier application.yml est disponible dans l’exemple spring-cloud-azure-starter-active-directory-b2c : aad-b2c-web-application sur GitHub.

  7. Enregistrez et fermez le fichier application.yml.

  8. Créez un dossier nommé contrôleur dans src/main/java/<yourGroupId/yourGroupId>>,< en <yourGroupId> remplaçant par la valeur que vous avez entrée pour Groupe.

  9. Créez un fichier Java nommé WebController.java dans le dossier controller, puis ouvrez-le dans un éditeur de texte.

  10. Entrez le code suivant, en modifiant yourGroupId de manière appropriée, puis enregistrez et fermez le fichier :

    package yourGroupId.yourGroupId.controller;
    
    import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
    import org.springframework.security.oauth2.core.user.OAuth2User;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Controller
    public class WebController {
    
        private void initializeModel(Model model, OAuth2AuthenticationToken token) {
            if (token != null) {
                final OAuth2User user = token.getPrincipal();
    
                model.addAttribute("grant_type", user.getAuthorities());
                model.addAllAttributes(user.getAttributes());
            }
        }
    
        @GetMapping(value = "/")
        public String index(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "home";
        }
    
        @GetMapping(value = "/greeting")
        public String greeting(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "greeting";
        }
    
        @GetMapping(value = "/home")
        public String home(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "home";
        }
    }
    

    Étant donné que chaque méthode du contrôleur appelle initializeModel(), et que cette méthode appelle model.addAllAttributes(user.getAttributes());, toute page HTML dans src/main/Resources/templates peut accéder à n’importe lequel de ces attributs, par exemple ${name}, ${grant_type} ou ${auth_time}. Les valeurs retournées à partir de user.getAttributes() sont en fait les revendications de l’id_token pour l’authentification. La liste complète des revendications disponibles figure dans Jetons d’ID de la plateforme d’identités Microsoft.

  11. Créez un dossier nommé sécurité dans src/main/java/<yourGroupId/yourGroupId>>,< en yourGroupId remplaçant par la valeur que vous avez entrée pour Group.

  12. Créez un fichier Java nommé WebSecurityConfiguration.java dans le dossier security, puis ouvrez-le dans un éditeur de texte.

  13. Entrez le code suivant, en modifiant yourGroupId de manière appropriée, puis enregistrez et fermez le fichier :

    package yourGroupId.yourGroupId.security;
    
    import com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cOidcLoginConfigurer;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @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()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .apply(configurer)
            ;
        }
    }
    
  14. Copiez le fichier home.html à partir de spring-cloud-azure-starter-active-directory-b2c : aad-b2c-web-application vers src/main/resources/templates, puis remplacez les ${your-profile-edit-user-flow}${your-password-reset-user-flow} flux utilisateur que vous avez créés précédemment.

Générer et tester votre application

  1. Ouvrez une invite de commandes, puis définissez le répertoire sur le dossier hébergeant le fichier pom.xml de votre application.

  2. Générez votre application Spring Boot avec Maven, puis exécutez-la. Par exemple :

    Remarque

    Il est extrêmement important que l’heure de l’horloge système sous laquelle l’application Spring Boot locale s’exécute soit précise. Il y a très peu de tolérance de décalage de l’horloge lors de l’utilisation d’OAuth 2.0. Même un écart de trois minutes peut provoquer l’échec de la connexion avec une erreur similaire à [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. À la date de rédaction de cet article, time.gov offre une indication du décalage entre l’heure de votre horloge et l’heure réelle. L’application a été exécutée correctement avec un décalage de + 0,019 seconde.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. Une fois que votre application est créée et démarrée dans Maven, ouvrez http://localhost:8080/ dans un navigateur web ; vous devez être redirigé vers la page de connexion.

    Page de connexion de l’application web.

  4. Sélectionnez le lien avec le texte relatif à la connexion. Vous devez être redirigé vers Azure AD B2C pour démarrer le processus d’authentification.

  5. Une fois que vous vous êtes connecté avec succès, vous devez voir l’exemple home page à partir du navigateur,

    Connexion à l’application web réussie.

Dépannage

Les sections suivantes décrivent comment résoudre certains problèmes qui peuvent se présenter.

Nom d’attribut manquant dans les attributs

Quand vous exécutez l’exemple, vous pouvez recevoir une exception avec le message Missing attribute 'name' in attributes. Le journal de cette exception ressemble à la sortie suivante :

java.lang.IllegalArgumentException: Missing attribute 'name' in attributes
at org.springframework.security.oauth2.core.user.DefaultOAuth2User.<init>(DefaultOAuth2User.java:67) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser.<init>(DefaultOidcUser.java:89) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:144) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:63) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]

Si vous recevez cette erreur, vérifiez le flux d’utilisateur que vous avez créé dans Tutoriel : Créer des flux d’utilisateur dans Azure Active Directory B2C. Lors de la création du flux d’utilisateur, dans Attributs utilisateur et revendications, veillez à choisir des attributs et des revendications pour le Nom d’affichage. Veillez également à configurer correctement user-name-attribute-name dans le fichier application.yml.

Se connecter avec des boucles au point de terminaison B2C

Ce problème est probablement dû à des cookies pollués pour localhost. Nettoyez les cookies pour localhost et réessayez.

Résumé

Dans ce tutoriel, vous avez crée une application web Java avec l’application de démarrage Azure Active Directory B2C, configuré un nouveau locataire Azure AD B2C et inscrit une nouvelle application, puis vous avez configuré votre application pour utiliser les annotations et classes Spring pour protéger l’application web.

Nettoyer les ressources

Quand vous n’en avez plus besoin des ressources créées dans le cadre de cet article, utilisez le portail Azure pour les supprimer afin d’éviter des frais imprévus.

Étapes suivantes

Pour en savoir plus sur Spring et Azure, poursuivez vers le centre de documentation Spring sur Azure.