Partager via


Sécurisez les applications Java Spring Boot en utilisant Azure Active Directory B2C

Cet article présente une application web Java Spring Boot qui connecte des utilisateurs sur votre locataire Azure Active Directory B2C à l’aide de la bibliothèque de client Spring Boot Starter Azure AD B2C pour Java. Il utilise le protocole OpenID Connect.

Le diagramme suivant illustre la topologie de l’application :

Diagramme qui montre la topologie de l’application.

L’application cliente utilise la bibliothèque de client 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 lui permet d’accéder aux itinéraires protégés.

Prérequis

Recommandations

  • Un certaine connaissance de Spring Framework.
  • Être familiarisé avec le terminal Linux/OSX.
  • 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 au courant des dernières évolutions.

Configurer l’exemple

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

Clonez ou téléchargez l’exemple de dépôt

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

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/1-Authentication/sign-in-b2c

Vous pouvez également accéder au dépôt ms-identity-msal-java-samples, puis le télécharger en tant que fichier .zip et l’extraire sur votre disque dur.

Important

Pour éviter les limitations de longueur de fichier sous Windows, clonez ou extrayez le dépôt dans un répertoire proche de la racine de votre disque dur.

Cet exemple est fourni avec une application préinscrite à 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 en savoir plus, consultez la section Inscrire l’application. Sinon, passez aux étapes de la section Exécuter l’exemple.

Choisissez le locataire Azure AD B2C où vous voulez créer vos applications.

Pour choisir votre locataire, suivez les étapes ci-dessous :

  1. Connectez-vous au portail Azure.

  2. Si votre compte figure dans plusieurs locataires Azure AD B2C, sélectionnez votre profil dans le coin du portail Azure, puis changer d’annuaire pour faire correspondre votre session de portail au locataire Azure AD B2C souhaité.

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

Pour créer des flux d’utilisateurs pour l’inscription, la connexion, la modification de profil et la réinitialisation du mot de passe, consultez le Tutoriel : Créer des flux d’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 n’entre pas dans l’étendu de ce tutoriel. Pour en savoir plus, consultez la Vue d’ensemble de la stratégie personnalisée d’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-b2c)

Pour inscrire l’application, effectuez les étapes suivantes :

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

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

  3. Dans la page Inscrire une application qui s’affiche, saisissez les informations suivantes relatives à l’inscription de votre application :

    • Dans la section Nom, saisissez un nom d’application cohérent qui s’affichera pour les 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 modifiable 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 ID d’application (client) pour l’utiliser ultérieurement. Vous utilisez cette valeur dans le ou les fichiers de configuration de votre application.

  6. Cliquez sur Enregistrer pour enregistrer vos modifications.

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

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

  9. Saisissez une description (par exemple, secret de l’application).

  10. Sélectionnez l’une des durées disponibles en fonction de vos préoccupations en matière de sécurité, par exemple, Dans 2 ans.

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

  12. Copiez et sauvegardez la valeur générée pour l’utiliser dans les étapes ultérieures. Vous avez besoin de cette valeur pour les fichiers de configuration de votre code. Cette valeur n’apparaîtra plus, et vous ne pouvez pas la récupérer par d’autres moyens. Veillez donc à la sauvegarder à partir du portail Azure avant d’accéder un autre écran ou à un autre volet.

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

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

Remarque

Dans les étapes suivantes, ClientID est identique à Application ID ou AppId.

  1. Ouvrez le projet dans votre IDE.

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

  3. Recherchez la propriété client-id et remplacez la valeur existante par l’ID d’application ou l’clientId de l’application java-spring-webapp-auth-b2c que vous avez copiée à partir du portail Azure.

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

  5. Recherchez la propriété base-uri 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é sign-up-or-sign-in et remplacez-la 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é profile-edit et remplacez-la par le nom de la stratégie de flux utilisateur de réinitialisation du mot de passe 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é password-reset et remplacez-la par le nom de la stratégie de flux utilisateur de modification du profil 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 flux b2c_1_susi et b2c_1_edit_profile, et remplacez-les par vos flux d’utilisateur sign-up-sign-in et profile-edit.

Exécution de l'exemple

Les sections suivantes vous expliquent comment déployer l’exemple sur Azure Container 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 verify
    
  2. Exécutez l’exemple de projet localement à l’aide de la commande suivante :

    mvn spring-boot:run
    

Programme d’installation

Pour vous connecter à Azure à partir de l’interface CLI, exécutez la commande suivante et suivez les invites pour procéder à l’authentification.

az login

Pour être sûr d’utiliser la dernière version de l’interface CLI, exécutez la commande de mise à niveau.

az upgrade

Ensuite, installez ou mettez à jour l’extension Azure Container Apps pour l’interface CLI.

Si vous recevez des erreurs concernant des paramètres manquants lorsque vous exécutez des commandes az containerapp dans Azure CLI, vérifiez que la dernière version de l’extension Azure Container Apps est installée.

az extension add --name containerapp --upgrade

Remarque

À compter de mai 2024, les extensions Azure CLI n’activent plus les fonctionnalités en préversion par défaut. Pour accéder aux fonctionnalités en préversion de Container Apps, installez l’extension Container Apps avec --allow-preview true.

az extension add --name containerapp --upgrade --allow-preview true

Maintenant que la version actuelle de l’extension ou du module est installée, inscrivez les espaces de noms Microsoft.App et Microsoft.OperationalInsights.

Remarque

Les ressources Azure Container Apps ont migré de l’espace de noms Microsoft.Web vers l’espace de noms Microsoft.App. Pour plus d’informations, reportez-vous à Migration de l’espace de noms de Microsoft.Web vers Microsoft.App en mars 2022.

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

Créer l’environnement Azure Container Apps

À présent que votre configuration Azure CLI est terminée, vous pouvez définir les variables d’environnement utilisées dans cet article.

Définissez les variables suivantes dans votre interpréteur de commandes Bash.

export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"

Créez un groupe de ressources.

az group create  \
    --name $RESOURCE_GROUP \
    --location $LOCATION \

Créer un environnement avec un espace de travail Log Analytics généré automatiquement.

az containerapp env create \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION

Afficher le domaine par défaut de l’environnement d’application conteneur. Notez ce domaine à utiliser dans les sections ultérieures.

az containerapp env show \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --query properties.defaultDomain

Préparer l’application pour le déploiement

Lorsque vous déployez votre application dans Azure Container Apps, votre URL de redirection devient l’URL de redirection de votre instance d’application déployée dans Azure Container Apps. Suivez les étapes ci-dessous pour modifier ces paramètres dans votre fichier application.yml :

  1. Naviguez jusqu’au fichier src\main\resources\application.yml de votre application et remplacez la valeur post-logout-redirect-uri par le nom de domaine de votre application déployée, comme indiqué dans l’exemple suivant. Veillez à remplacer <API_NAME> et <default-domain-of-container-app-environment> avec vos valeurs réelles : Par exemple, avec le domaine par défaut de votre environnement Azure Container App à l’étape précédente et ms-identity-api pour le nom de votre application, vous devez utiliser https://ms-identity-api.<default-domain> pour la valeur post-logout-redirect-uri.

    post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
    
  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 secret client dans le paramètre client-secret. Il n’est pas judicieux de conserver cette valeur dans ce fichier. Vous pouvez également prendre un risque en délivrant le fichier à un dépôt Git. Pour obtenir l’approche recommandée, consultez Gérer les secrets dans Azure Container Apps.

Mettez à jour l’enregistrement de votre application Microsoft Entra ID

Étant donné que l’URI de redirection change pour votre application déployée sur Azure Container Apps, vous devez également modifier l’URI de redirection dans votre enregistrement d’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 le champ de recherche pour rechercher l’enregistrement de votre application - par exemple, java-servlet-webapp-authentication.

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

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

  5. Dans la section Web - Redirection des URI, sélectionnez Ajouter un URI.

  6. Remplissez l’URI de votre application, en ajoutant /login/oauth2/code/ - par exemple, https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/.

  7. Cliquez sur Enregistrer.

Déployer l’application

Déployez le package JAR sur Azure Container Apps.

Remarque

Si nécessaire, vous pouvez spécifier la version de JDK dans les variables d’environnement de génération Java. Pour en savoir plus, consultez Créer des variables d’environnement pour Java dans Azure Container Apps.

Vous pouvez maintenant déployer votre fichier WAR avec la commande CLI az containerapp up.

az containerapp up \
    --name $API_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --environment $ENVIRONMENT \
    --artifact <JAR_FILE_PATH_AND_NAME> \
    --ingress external \
    --target-port 8080 \
    --query properties.configuration.ingress.fqdn

Remarque

La version par défaut du JDK est la version 17. Si vous devez changer la version de JDK pour qu’elle soit compatible avec votre application, vous pouvez utiliser l’argument --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION> pour ajuster le numéro de version.

Pour en savoir plus sur la génération de variables d’environnement, consultez Générer des variables d’environnement pour Java dans Azure Container Apps.

Validez l’application

Dans cet exemple, la commande containerapp up inclut l’argument --query properties.configuration.ingress.fqdn qui renvoie le nom de domaine complet (FQDN), également appelé URL de l’application. 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 Container Apps, sélectionnez Journaux d’activité pour vérifier les journaux d’activité de l’application.

Explorer l’exemple

Procédez comme suit pour examiner l’exemple :

  1. Notez l’état de connexion ou de déconnexion qui s’affiche au centre de l’écran.
  2. Sélectionnez le bouton contextuel dans le coin. Ce bouton indique 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 du fournisseur d’identité que vous avez choisi. Vous pouvez également choisir de vous inscrire ou de vous connecter à un compte local sur le locataire B2C à l’aide d’une adresse e-mail.
  4. Une fois le processus 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 processus de connexion.
  5. Notez que le bouton contextuel indique maintenant Déconnexion et affiche votre nom d’utilisateur.
  6. Si vous vous trouvez sur la page d’accueil, sélectionnez Détails du jeton d’ID pour voir certaines des revendications décodées du jeton d’ID.
  7. Modifier 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 de client Spring Boot Starter Azure AD B2C pour Java en vue de connecter des utilisateurs à votre locataire Azure AD B2C. L’exemple utilise également le client Spring Oauth2 et les boot starters Spring Web. L’exemple utilise les revendications de 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 du projet :

Fichier/Dossier Description
pom.xml Dépendances de l’application.
src/main/resources/templates/ Modèles Thymeleaf pour l’interface utilisateur.
src/main/resources/application.yml Configuration de la bibliothèque de l’application et de 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, quels itinéraires nécessitent une authentification.
.../Utilities.java Classe Utility : 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 jetons d’ID

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

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 se connecter, l’application effectue une demande au point de terminaison de connexion Azure AD B2C configuré automatiquement par la bibliothèque de client 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 point de terminaison logout, 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 est dotée d’une logique simple dans les pages modèles de l’interface utilisateur pour déterminer le contenu à afficher en fonction de l’authentification de l’utilisateur, comme le montre l’exemple suivant qui utilise les 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 à l’aide de la propriété app.protect.authenticated à 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 en savoir plus sur le fonctionnement des protocoles OAuth 2.0 dans ce scénario et dans d’autres, consultez Scénarios d’authentification pour Microsoft Entra ID.