Share via


Sécuriser des applications Java Spring Boot à l’aide d’Azure Active Directory B2C

Cet article illustre une application web Java Spring Boot qui connecte des utilisateurs sur votre locataire Azure Active Directory B2C à l’aide de la bibliothèque cliente Spring Boot Starter Azure AD B2C pour Java. Il utilise le protocole openID Connecter.

Le diagramme suivant illustre la topologie de l’application :

Diagramme montrant la topologie de l’application.

L’application cliente utilise la bibliothèque cliente Spring Boot Starter Azure AD B2C pour Java pour se connecter à un utilisateur et obtenir un jeton d’ID auprès d’Azure AD B2C. Le jeton d’ID prouve que l’utilisateur est authentifié auprès d’Azure AD B2C et permet à l’utilisateur d’accéder aux itinéraires protégés.

Prérequis

Recommandations

  • Certaines connaissances de Spring Framework
  • Certaines connaissances sur le terminal Linux/OSX ou Windows PowerShell
  • jwt.ms pour inspecter vos jetons.
  • Fiddler pour la supervision de votre activité réseau et la résolution des problèmes.
  • Suivez le blog Microsoft Entra ID pour rester à jour avec les derniers développements.

Configurer l’exemple

Les sections suivantes vous montrent comment configurer l’exemple d’application.

Cloner ou télécharger l’exemple de référentiel

Pour cloner l’exemple, ouvrez une fenêtre Bash et utilisez la commande suivante :

git clone https://github.com/Azure-Samples/ms-identity-java-spring-tutorial.git
cd ms-identity-java-spring-tutorial
cd 1-Authentication/sign-in-b2c

Vous pouvez également accéder au référentiel ms-identity-java-spring-tutorial , puis le télécharger en tant que fichier .zip et l’extraire sur votre disque dur.

Important

Pour éviter les limitations de longueur du chemin de fichier sur Windows, clonez ou extrayez le référentiel dans un répertoire près de la racine de votre disque dur.

Cet exemple est fourni avec une application préinscriée à des fins de démonstration. Si vous souhaitez utiliser votre propre locataire et application Azure AD B2C, inscrivez et configurez l’application dans le Portail Azure. Pour plus d’informations, consultez la section Inscrire l’application . Sinon, poursuivez les étapes de la section Exécuter l’exemple .

Choisissez le locataire Azure AD B2C dans lequel vous souhaitez créer vos applications

Pour choisir votre locataire, procédez comme suit :

  1. Connectez-vous au portail Azure.

  2. Si votre compte est présent dans plusieurs locataires Azure AD B2C, sélectionnez votre profil dans le coin de l’Portail Azure, puis sélectionnez Changer d’annuaire pour modifier votre session en locataire Azure AD B2C souhaité.

Créer des flux utilisateur et des stratégies personnalisées

Pour créer des flux utilisateur courants tels que l’inscription, la connexion, la modification de profil et la réinitialisation de mot de passe, consultez tutoriel : Créer des flux utilisateur dans Azure Active Directory B2C.

Vous devez également envisager de créer des stratégies personnalisées dans Azure Active Directory B2C. Toutefois, cette tâche dépasse le cadre de ce didacticiel. Pour plus d’informations, consultez la vue d’ensemble de la stratégie personnalisée Azure AD B2C.

Ajouter des fournisseurs d’identité externes

Consultez le tutoriel : Ajouter des fournisseurs d’identité à vos applications dans Azure Active Directory B2C.

Inscrire l’application (java-spring-webapp-auth-b2c)

Pour inscrire l’application, procédez comme suit :

  1. Accédez au Portail Azure et sélectionnez Azure AD B2C.

  2. Sélectionnez Inscriptions d’applications dans le volet de navigation, puis Nouvelle inscription.

  3. Dans la page Inscrire une application qui s’affiche, entrez les informations d’inscription d’application suivantes :

    • Dans la section Nom , entrez un nom d’application explicite pour l’affichage aux utilisateurs de l’application, par exemple java-spring-webapp-auth-b2c.
    • Sous Types de comptes pris en charge, sélectionnez Comptes dans n’importe quel fournisseur d’identité ou annuaire d’organisation (pour authentifier les utilisateurs avec les flux d’utilisateurs).
    • Dans la section URI de redirection (facultatif), sélectionnez Web dans la zone de liste déroulante et entrez l’URI de redirection suivant : http://localhost:8080/login/oauth2/code/.
  4. Sélectionnez Inscrire pour créer l’application.

  5. Dans la page d’inscription de l’application, recherchez et copiez la valeur d’ID d’application (client) à utiliser ultérieurement. Vous utilisez cette valeur dans le fichier de configuration ou les fichiers de votre application.

  6. Cliquez sur Enregistrer pour enregistrer vos modifications.

  7. Dans la page d’inscription de l’application, sélectionnez le volet Certificats et secrets dans le volet de navigation pour ouvrir la page pour générer des secrets et charger des certificats.

  8. Dans la section Secrets client, sélectionnez Nouveau secret client.

  9. Tapez une description ( par exemple, secret d’application).

  10. Sélectionnez l’une des durées disponibles en fonction de vos problèmes de sécurité , par exemple, dans 2 ans.

  11. Sélectionnez Ajouter. La valeur générée s’affiche.

  12. Copiez et enregistrez la valeur générée à utiliser dans les étapes ultérieures. Vous avez besoin de cette valeur pour les fichiers de configuration de votre code. Cette valeur n’est plus affichée et vous ne pouvez pas la récupérer par d’autres moyens. Veillez donc à l’enregistrer à partir de l’Portail Azure avant d’accéder à n’importe quel autre écran ou volet.

Configurer l’application (java-spring-webapp-auth-b2c) pour utiliser votre inscription d’application

Pour configurer l’application, procédez comme suit :

Remarque

Dans les étapes suivantes, ClientID il s’agit de la même chose que Application ID ou AppId.

  1. Ouvrez le projet dans votre IDE.

  2. Ouvrez le fichier src/main/resources/application.yml .

  3. Recherchez la client-id propriété et remplacez la valeur existante par l’ID d’application ou clientId l’application java-spring-webapp-auth-b2c à partir du Portail Azure.

  4. Recherchez la client-secret propriété et remplacez la valeur existante par la valeur que vous avez enregistrée lors de la création de l’application java-spring-webapp-auth-b2c à partir du Portail Azure.

  5. Recherchez la base-uri propriété et remplacez les deux instances de la valeur fabrikamb2c par le nom du locataire Azure AD B2C dans lequel vous avez créé l’application java-spring-webapp-auth-b2c dans le Portail Azure.

  6. Recherchez la propriété et remplacez-la sign-up-or-sign-in par le nom de la stratégie de flux utilisateur d’inscription/connexion que vous avez créée dans le locataire Azure AD B2C dans lequel vous avez créé l’application java-spring-webapp-auth-b2c dans le Portail Azure.

  7. Recherchez la propriété et remplacez-la profile-edit par le nom de la stratégie de réinitialisation de flux utilisateur que vous avez créée dans le locataire Azure AD B2C dans lequel vous avez créé l’application java-spring-webapp-auth-b2c dans le Portail Azure.

  8. Recherchez la propriété et remplacez-la password-reset par le nom de la stratégie de flux utilisateur de profil de modification que vous avez créée dans le locataire Azure AD B2C dans lequel vous avez créé l’application java-spring-webapp-auth-b2c dans le Portail Azure.

  9. Ouvrez le fichier src/main/resources/templates/navbar.html .

  10. Recherchez les références aux b2c_1_susi flux et b2c_1_edit_profile remplacez-les par vos flux et profile-edit vos sign-up-sign-in flux utilisateur.

Exécution de l'exemple

Les sections suivantes vous montrent comment déployer l’exemple sur Azure Spring Apps.

Prérequis

Préparer le projet Spring

Suivez la procédure ci-dessous pour préparer le projet :

  1. Utilisez la commande Maven suivante pour générer le projet :

    mvn clean package
    
  2. Exécutez l’exemple de projet localement à l’aide de la commande suivante :

    mvn spring-boot:run
    

Configurer le plug-in Maven

Exécutez la commande suivante à la racine du projet pour configurer l’application à l’aide du plug-in Maven pour Azure Spring Apps :

mvn com.microsoft.azure:azure-spring-apps-maven-plugin:1.19.0:config

La liste suivante décrit les interactions de commande :

  • Connexion OAuth2 : vous devez autoriser la connexion à Azure en fonction du protocole OAuth2.
  • Sélectionnez un abonnement : sélectionnez le numéro de liste d’abonnements dans lequel vous souhaitez créer votre instance Azure Spring Apps, qui correspond par défaut au premier abonnement de la liste. Si vous souhaitez utiliser le numéro par défaut, appuyez sur Entrée.
  • Entrez le nom d’Azure Spring Apps : entrez le nom de l’instance spring apps que vous souhaitez créer. Si vous souhaitez utiliser le nom par défaut, appuyez sur Entrée.
  • Entrez le nom du groupe de ressources : entrez le nom du groupe de ressources dans lequel vous souhaitez créer votre instance spring apps. Si vous souhaitez utiliser le nom par défaut, appuyez sur Entrée.
  • Références SKU : sélectionnez la référence SKU que vous souhaitez utiliser pour votre instance spring apps. Si vous souhaitez utiliser le numéro par défaut, appuyez sur Entrée.
  • Entrer le nom de l’application : indiquez un nom pour l’application. Si vous souhaitez utiliser l’ID d’artefact de projet par défaut, appuyez sur Entrée.
  • Runtimes : sélectionnez le runtime que vous souhaitez utiliser pour votre instance spring apps. Dans ce cas, vous devez utiliser le numéro par défaut. Appuyez donc sur Entrée.
  • Exposer l’accès public pour cette application (boot-for-azure) : appuyez sur o.
  • Confirmez pour enregistrer toutes les configurations ci-dessus : appuyez sur y (oui). Si vous appuyez sur n, la configuration n’est pas enregistrée dans le fichier .pom .

L’exemple suivant montre la sortie du processus de déploiement :

Summary of properties:
Subscription id   : 12345678-1234-1234-1234-123456789101
Resource group name : rg-ms-identity-spring-boot-webapp
Azure Spring Apps name : cluster-ms-identity-spring-boot-webapp
Runtime Java version : Java 11
Region            : eastus
Sku               : Standard
App name          : ms-identity-spring-boot-webapp
Public access     : true
Instance count/max replicas : 1
CPU count         : 1
Memory size(GB)   : 2
Confirm to save all the above configurations (Y/n):
[INFO] Configurations are saved to: /home/user/ms-identity-java-spring-tutorial/1-Authentication/sign-in/pom.    xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:57 min
[INFO] Finished at: 2024-02-14T13:50:44Z
[INFO] ------------------------------------------------------------------------

Une fois que vous avez confirmé vos choix, le plug-in ajoute l’élément de plug-in et les paramètres requis au fichier de pom.xml de votre projet pour configurer votre application à exécuter dans Azure Spring Apps.

La partie pertinente du fichier pom.xml doit ressembler à l’exemple suivant :

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-spring-apps-maven-plugin</artifactId>
    <version>1.19.0</version>
    <configuration>
        <subscriptionId>12345678-1234-1234-1234-123456789101</subscriptionId>
        <resourceGroup>rg-ms-identity-spring-boot-webapp</resourceGroup>
        <clusterName>cluster-ms-identity-spring-boot-webapp</clusterName>
        <region>eastus</region>
        <sku>Standard</sku>
        <appName>ms-identity-spring-boot-webapp</appName>
        <isPublic>true</isPublic>
        <deployment>
            <cpu>1</cpu>
            <memoryInGB>2</memoryInGB>
            <instanceCount>1</instanceCount>
            <runtimeVersion>Java 11</runtimeVersion>
            <resources>
                <resource>
                    <directory>${project.basedir}/target</directory>
                    <includes>
                        <include>*.jar</include>
                    </includes>
                </resource>
            </resources>
        </deployment>
    </configuration>
</plugin>

Vous pouvez modifier les configurations d’Azure Spring Apps directement dans votre fichier pom.xml . Certaines configurations courantes sont répertoriées dans le tableau suivant :

Propriété Obligatoire Description
subscriptionId false L'ID de l'abonnement.
resourceGroup true Groupe de ressources Azure pour votre instance Azure Spring Apps.
clusterName true Nom du cluster Azure Spring Apps. Si vous utilisez un abonnement et un groupe de ressources sur utilisant déjà une instance Azure Spring Apps déployée, vous pouvez également utiliser ce cluster existant pour le déployer.
appName true Nom de votre application dans Azure Spring Apps.
region false Région dans laquelle héberger votre instance Azure Spring Apps. La valeur par défaut est eastus. Pour les régions valides, consultez Régions prises en charge.
sku false Niveau tarifaire de votre instance Azure Spring Apps. La valeur par défaut est Basic, qui est adaptée uniquement aux environnements de développement et de test.
runtime false Configuration de l’environnement d’exécution. Pour plus d’informations, consultez Détails de configuration.
deployment false Configuration du déploiement. Pour plus d’informations, consultez Détails de configuration.

Pour obtenir la liste complète des configurations, consultez la documentation de référence sur le plug-in. Tous les plug-ins Azure Maven partagent un ensemble commun de configurations. Pour ces configurations, consultez Configurations courantes. Pour connaître les configurations spécifiques à Azure Spring Apps, consultez Azure Spring Apps : Détails de configuration.

Veillez à enregistrer les valeurs et appName les clusterName valeurs pour une utilisation ultérieure.

Préparer l’application pour le déploiement

Lorsque vous déployez votre application sur Azure Spring Apps, votre URL de redirection passe à l’URL de redirection de votre instance d’application déployée dans Azure Spring Apps. Procédez comme suit pour modifier ces paramètres dans votre fichier application.yml :

  1. Accédez au fichier src\main\resources\application.yml de votre application et modifiez la valeur du post-logout-redirect-uri nom de domaine de votre application déployée, comme illustré dans l’exemple suivant. Par exemple, si vous avez choisi cluster-ms-identity-spring-boot-webapp votre instance Azure Spring Apps à l’étape précédente et ms-identity-spring-boot-webapp pour le nom de votre application, vous devez maintenant l’utiliser https://cluster-ms-identity-spring-boot-webapp-ms-identity-spring-boot-webapp.azuremicroservices.io pour la post-logout-redirect-uri valeur.

    post-logout-redirect-uri: https://<cluster-name>-<app-name>.azuremicroservices.io
    
  2. Après avoir enregistré ce fichier, utilisez la commande suivante pour reconstruire votre application :

    mvn clean package
    

Important

Le fichier application.yml de l’application contient actuellement la valeur de votre clé secrète client dans le client-secret paramètre. Il n’est pas recommandé de conserver cette valeur dans ce fichier. Vous risquez peut-être également de le valider dans un dépôt Git.

En guise d’étape de sécurité supplémentaire, vous pouvez stocker cette valeur dans Azure Key Vault et charger le secret à partir de Key Vault pour le rendre disponible dans votre application.

Mettre à jour votre inscription d’application Microsoft Entra ID

Étant donné que l’URI de redirection change vers votre application déployée sur Azure Spring Apps, vous devez également modifier l’URI de redirection dans l’inscription de votre application Microsoft Entra ID. Pour cela, effectuez les étapes suivantes :

  1. Accédez à la page Inscriptions d’applications de la plateforme d’identités Microsoft pour les développeurs.

  2. Utilisez la zone de recherche pour rechercher l’inscription de votre application , par exemple java-servlet-webapp-authentication.

  3. Ouvrez votre inscription d’application en sélectionnant son nom.

  4. Sélectionnez Authentification dans le menu déroulant.

  5. Dans la section URI de redirection web - , sélectionnez Ajouter un URI.

  6. Renseignez l’URI de votre application, en ajoutant /login/oauth2/code/ , par exemple https://<cluster-name>-<app-name>.azuremicroservices.io/login/oauth2/code/.

  7. Sélectionnez Enregistrer.

Déployer l’application

Utilisez la commande suivante pour déployer l’application :

mvn azure-spring-apps:deploy

La liste suivante décrit l’interaction de commande :

  • Connexion OAuth2 : vous devez autoriser la connexion à Azure en fonction du protocole OAuth2.

Une fois la commande exécutée, les messages de journal suivants indiquent que le déploiement a réussi :

[INFO] Deployment(default) is successfully created
[INFO] Starting Spring App after deploying artifacts...
[INFO] Deployment Status: Running
[INFO]   InstanceName:demo-default-x-xxxxxxxxxx-xxxxx  Status:Running Reason:null       DiscoverStatus:UNREGISTERED
[INFO]   InstanceName:demo-default-x-xxxxxxxxx-xxxxx  Status:Terminating Reason:null       DiscoverStatus:UNREGISTERED
[INFO] Getting public url of app(demo)...
[INFO] Application url: https://<your-Azure-Spring-Apps-instance-name>-demo.azuremicroservices.io

Valider l’application

Une fois le déploiement terminé, accédez à l’application avec l’URL de l’application de sortie. Procédez comme suit pour vérifier les journaux d’activité de l’application afin d’identifier un éventuel problème de déploiement :

  1. Accédez à l’URL de l’application de sortie à partir de la page Sorties de la section Déploiement .

  2. Dans le volet de navigation de la page Vue d’ensemble de l’instance Azure Spring Apps, sélectionnez Journaux d’activité pour vérifier les journaux d’activité de l’application.

Explorer l’exemple

Pour explorer l’exemple, procédez comme suit :

  1. Notez que l’état de connexion ou de déconnexion s’affiche au centre de l’écran.
  2. Sélectionnez le bouton contextuel dans le coin. Ce bouton lit la connexion lorsque vous exécutez l’application pour la première fois. Vous pouvez également sélectionner le lien vers les détails du jeton. Étant donné que cette page est protégée et nécessite une authentification, vous êtes automatiquement redirigé vers la page de connexion.
  3. Dans la page suivante, suivez les instructions et connectez-vous avec un compte de votre fournisseur d’identité choisi. Vous pouvez également choisir d’inscrire ou de vous connecter à un compte local sur le locataire B2C à l’aide d’une adresse e-mail.
  4. Une fois le flux de connexion terminé, vous devez être redirigé vers la page d’accueil , qui affiche l’état de connexion ou la page de détails du jeton, selon le bouton qui a déclenché votre flux de connexion.
  5. Notez que le bouton contextuel indique maintenant se déconnecter et affiche votre nom d’utilisateur.
  6. Si vous êtes sur la page d’accueil, sélectionnez Détails du jeton d’ID pour afficher certaines revendications décodées du jeton d’ID.
  7. Modifiez votre profil. Sélectionnez Modifier le profil pour modifier les détails tels que votre nom d’affichage, votre lieu de résidence et votre profession.
  8. Utilisez le bouton dans le coin pour vous déconnecter. La page d’état reflète le nouvel état.

À propos du code

Cet exemple montre comment utiliser la bibliothèque cliente Spring Boot Starter Azure AD B2C pour Java afin de connecter des utilisateurs à votre locataire Azure AD B2C. L’exemple utilise également les démarrages spring Oauth2 Client et Spring Web Boot. L’exemple utilise les revendications du jeton d’ID obtenu à partir d’Azure AD B2C pour afficher les détails de l’utilisateur connecté.

Contenu

Le tableau suivant montre le contenu de l’exemple de dossier de projet :

Fichier/Dossier Description
pom.xml Dépendances d’application.
src/main/resources/templates/ Modèles Thymeleaf pour l’interface utilisateur.
src/main/resources/application.yml Configuration de la bibliothèque Application et Microsoft Entra Boot Starter.
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ Ce répertoire contient le point d’entrée, le contrôleur et les classes de configuration principaux de l’application.
.../MsIdentitySpringBootWebappApplication.java Classe principale.
.../SampleController.java Contrôleur avec mappages de point de terminaison.
.../SecurityConfig.java Configuration de la sécurité : par exemple, les itinéraires nécessitent une authentification.
.../Utilities.java Classe utilitaire : par exemple, filtrer les revendications de jeton d’ID.
CHANGELOG.md Liste des modifications apportées à l’exemple.
CONTRIBUTING.md Instructions pour contribuer à l’exemple.
LICENCE Licence de l’exemple.

Revendications de jeton d’ID

Pour extraire les détails du jeton, l’application utilise spring Security et OidcUser l’objet AuthenticationPrincipal dans un mappage de requête, comme illustré dans l’exemple suivant, comme illustré dans l’exemple suivant. Pour plus d’informations sur la façon dont cette application utilise les revendications de jeton d’ID, consultez l’exemple de contrôleur .

import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
    Map<String, Object> claims = principal.getIdToken().getClaims();
}

Pour la connexion, l’application effectue une demande au point de terminaison de connexion Azure AD B2C configuré automatiquement par la bibliothèque cliente Spring Boot Starter Azure AD B2C pour Java, comme illustré dans l’exemple suivant :

<a class="btn btn-success" href="/oauth2/authorization/{your-sign-up-sign-in-user-flow}">Sign In</a>

Pour la déconnexion, l’application effectue une requête POST au logout point de terminaison, comme indiqué dans l’exemple suivant :

<form action="#" th:action="@{/logout}" method="post">
  <input class="btn btn-warning" type="submit" value="Sign Out" />
</form>

Éléments d’interface utilisateur dépendant de l’authentification

L’application a une logique simple dans les pages de modèle d’interface utilisateur pour déterminer le contenu à afficher en fonction de l’authentification de l’utilisateur, comme illustré dans l’exemple suivant utilisant des balises Spring Security Thymeleaf :

<div sec:authorize="isAuthenticated()">
  this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
  this content only shows to not-authenticated users
</div>

Protéger les itinéraires avec WebSecurityConfigurerAdapter

Par défaut, l’application protège la page Détails du jeton d’ID afin que seuls les utilisateurs connectés puissent y accéder. L’application configure ces itinéraires à partir de la app.protect.authenticated propriété à partir du fichier application.yml . Pour configurer les exigences spécifiques de votre application, vous pouvez étendre WebSecurityConfigurerAdapter dans l’une de vos classes. Pour obtenir un exemple, consultez la classe SecurityConfig de cette application, illustrée dans le code suivant :

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${app.protect.authenticated}")
    private String[] protectedRoutes;

    private final AADB2COidcLoginConfigurer configurer;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeRequests()
            .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details)
            .antMatchers("/**").permitAll()                  // allow all other routes.
            .and()
            .apply(configurer)
            ;
        // @formatter:off
    }
}

Plus d’informations

Pour plus d’informations sur le fonctionnement des protocoles OAuth 2.0 dans ce scénario et d’autres scénarios, consultez Scénarios d’authentification pour Microsoft Entra ID.