Proteggere le app Java Spring Boot con Azure Active Directory B2C

Questo articolo illustra un'app Web Java Spring Boot che consente agli utenti di accedere al tenant Azure Active Directory B2C usando la libreria client Azure AD B2C Spring Boot Starter per Java. Usa il protocollo OpenID Connect.

Nota

A partire dal 1° maggio 2025, Azure Active Directory B2C non è più disponibile per l'acquisto per i nuovi clienti. I clienti esistenti possono continuare a usare Azure AD B2C, con supporto fornito fino ad almeno maggio 2030. Per i nuovi progetti CIAM (Customer Identity and Access Management), usare Microsoft Entra per ID esterno.

Il diagramma seguente illustra la topologia dell'app:

Diagramma che mostra la topologia dell'app.

L'app client usa la libreria client Spring Boot Starter di Azure AD B2C per Java per accedere a un utente e ottenere un token ID da Azure AD B2C. Il token ID dimostra che l'utente è autenticato con Azure AD B2C e consente all'utente di accedere alle route protette.

Prerequisiti

  • versione 15 di JDK. Questo esempio è stato sviluppato in un sistema con Java 15, ma potrebbe essere compatibile con altre versioni.
  • Maven 3
  • Java Extension Pack for Visual Studio Code è consigliato per eseguire questo esempio in Visual Studio Code.
  • Un tenant di Azure AD B2C. Per ulteriori informazioni, vedere Esercitazione: Creare un tenant di Azure Active Directory B2C
  • Visual Studio Code
  • Strumenti di Azure per Visual Studio Code

Consigli

  • Una certa familiarità con il Spring Framework.
  • Una certa familiarità con il terminale Linux/OSX.
  • jwt.ms per esaminare i tuoi token.
  • Fiddler per monitorare l'attività di rete e risolvere i problemi.
  • Segui il blog di Microsoft Entra per rimanere up-to-date con gli ultimi sviluppi.

Configurare l'esempio

Le sezioni seguenti illustrano come configurare l'applicazione di esempio.

Clonare o scaricare il repository di esempio

Per clonare l'esempio, aprire una finestra Bash e usare il comando seguente:

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

In alternativa, passa al repository ms-identity-msal-java-samples, quindi scaricalo come file .zip ed estrailo sul disco rigido.

Importante

Per evitare limitazioni di lunghezza del percorso di file in Windows, clonare o estrarre il repository in una directory vicino alla radice del disco rigido.

Questo esempio viene fornito con un'applicazione preregistrata a scopo dimostrativo. Se si vuole usare un tenant e un'applicazione Azure AD B2C personalizzati, registrare e configurare l'applicazione nel portale di Azure. Per altre informazioni, vedi la sezione Registrare l'app. In caso contrario, continua con i passaggi nella sezione Eseguire l'esempio.

Scegliere il tenant di Azure AD B2C in cui si vogliono creare le applicazioni

Per scegliere il tenant, seguire questa procedura:

  1. Accedi al portale di Azure.

  2. Se l'account è presente in più tenant di Azure AD B2C, selezionare il profilo nell'angolo del portale di Azure e quindi selezionare Cambia directory per modificare la sessione nel tenant di Azure AD B2C desiderato.

Creare flussi utente e criteri personalizzati

Per creare flussi utente comuni come la registrazione, l'accesso, la modifica del profilo e la reimpostazione della password, vedere Esercitazione: Creare flussi utente in Azure Active Directory B2C.

È consigliabile prendere in considerazione anche la creazione di criteri personalizzati in Azure Active Directory B2C. Tuttavia, questa attività non rientra nell'ambito di questa esercitazione. Per altre informazioni, vedi Panoramica dei criteri personalizzati di Azure AD B2C.

Aggiungere provider di identità esterni

Vedere Esercitazione: aggiungere provider di identità alle applicazioni in Azure Active Directory B2C.

Registrare l'app (java-spring-webapp-auth-b2c)

Per registrare l'app, seguire questa procedura:

  1. Passare al portale di Azure e selezionare Azure AD B2C.

  2. Selezionare Registrazioni app nel riquadro di spostamento e quindi selezionare Nuova registrazione.

  3. Nella pagina Registra un'applicazione visualizzata immettere le informazioni di registrazione dell'applicazione seguenti:

    • Nella sezione Nome, immetti un nome significativo per l'applicazione da mostrare agli utenti dell'app, ad esempio .
    • In Tipi di account supportati, seleziona Account in qualsiasi provider di identità o directory organizzativa (per autenticare gli utenti con flussi utente).
    • Nella sezione URI di reindirizzamento (facoltativo), seleziona Web nella casella combinata e immetti il seguente URI di reindirizzamento: .
  4. Selezionare Registra per creare l'applicazione.

  5. Nella pagina di registrazione dell'app, trova e copia il valore ID applicazione (client) da utilizzare in seguito. Questo valore viene usato nel file o nei file di configurazione dell'app.

  6. Seleziona Salva per salvare le modifiche.

  7. Nella pagina di registrazione dell'app selezionare il riquadro Certificati e segreti nel riquadro di spostamento per aprire la pagina per generare segreti e caricare i certificati.

  8. Nella sezione Segreti client seleziona Nuovo segreto client.

  9. Digitare una descrizione, ad esempio il segreto dell'app.

  10. Selezionare una scadenza per il segreto o specificare una durata personalizzata. I segreti client sono limitati a una durata massima di 24 mesi e Microsoft consiglia una scadenza inferiore a 12 mesi. Per le app di produzione, preferire un certificato o credenziali di identità federate rispetto a un segreto client.

  11. Selezionare Aggiungi. Viene visualizzato il valore generato.

  12. Copiare e salvare il valore generato da usare nei passaggi successivi. Questo valore è necessario per i file di configurazione del codice. Questo valore non viene visualizzato di nuovo e non è possibile recuperarlo con altri mezzi. Assicurarsi quindi di salvarlo dal portale di Azure prima di passare a qualsiasi altra schermata o riquadro.

Configura l'app (java-spring-webapp-auth-b2c) per utilizzare la registrazione dell'applicazione

Usare la procedura seguente per configurare l'app:

Nota

Nei passaggi seguenti, indica lo stesso valore di o .

  1. Aprire il progetto nell'IDE.

  2. Apri il file src/main/resources/application.yml.

  3. Individuare la proprietà e sostituire il valore esistente con l'ID applicazione o dell'applicazione nel portale di Azure.

  4. Trova la proprietà e sostituisci il valore esistente con il valore che hai salvato durante la creazione dell'applicazione nel portale di Azure.

  5. Individuare la proprietà e sostituire le due istanze del valore con il nome del tenant di Azure AD B2C in cui è stata creata l'applicazione nel portale di Azure.

  6. Individua la proprietà e sostituiscila con il nome del criterio del flusso utente di registrazione/accesso che hai creato nel tenant Azure AD B2C in cui hai creato l'applicazione nel portale di Azure.

  7. Individuare la proprietà e sostituirla con il nome del criterio del flusso utente per la reimpostazione della password creato nel tenant Azure AD B2C in cui è stata creata l'applicazione nel portale di Azure.

  8. Individuare la proprietà e sostituirla con il nome del criterio del flusso utente di modifica del profilo creato nel tenant Azure AD B2C in cui è stata creata l'applicazione nel portale di Azure.

  9. Apri il file src/main/resources/templates/navbar.html.

  10. Individuare i riferimenti ai flussi e e sostituirli con i flussi utente e .

Esegui l'esempio

  • Distribuire in App contenitore di Azure
  • Esegui in locale

Le sezioni seguenti illustrano come distribuire l'esempio in App Contenitore di Azure.

Prerequisiti

  • Un account Azure. Se non ne hai uno, crea un account gratuito. Per continuare, è necessaria l'autorizzazione Contributor o Owner per la sottoscrizione di Azure. Per ulteriori informazioni, vedere Assegnare ruoli di Azure tramite il portale di Azure.
  • interfaccia della riga di comando di Azure.
  • L'estensione dell'interfaccia della riga di comando di App contenitore di Azure, versione o versione successiva. Per installare la versione più recente, usa il comando .
  • Il Java Development Kit, versione 17 o successiva.
  • Maven.

Preparare il progetto Spring

Per preparare il progetto, seguire questa procedura:

  1. Usa il seguente comando Maven per eseguire la build del progetto:

    mvn clean verify
    
  2. Eseguire il progetto di esempio in locale usando il comando seguente:

    mvn spring-boot:run
    

Configurazione

Per accedere ad Azure dall'interfaccia della riga di comando, eseguire il comando seguente e seguire le istruzioni per completare il processo di autenticazione.

az login

Per assicurarti di utilizzare la versione più recente della CLI, esegui il comando di aggiornamento.

az upgrade

Successivamente, installare o aggiornare l'estensione App contenitore di Azure per l'interfaccia della riga di comando (CLI).

Se vengono visualizzati errori relativi a parametri mancanti quando si eseguono i comandi in interfaccia della riga di comando di Azure, assicurarsi di avere installato la versione più recente dell'estensione di App contenitore di Azure.

az extension add --name containerapp --upgrade

Nota

A partire da maggio 2024, le estensioni dell'interfaccia della riga di comando di Azure non abilitano più le funzionalità di anteprima per impostazione predefinita. Per accedere alle funzionalità di anteprima di Container Apps, installare l'estensione Container Apps con .

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

Ora che l'estensione o il modulo corrente è installato, registrare gli spazi dei nomi e .

Nota

Le risorse di App contenitore di Azure sono state trasferite dallo spazio dei nomi allo spazio dei nomi . Per maggiori dettagli, vedere Migrazione del namespace da Microsoft.Web a Microsoft.App a marzo 2022.

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

Creare l'ambiente di App contenitore di Azure

Dopo aver completato la configurazione dell'interfaccia della riga di comando di Azure, è possibile definire le variabili di ambiente usate in questo articolo.

Definire le variabili seguenti nella shell 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"

Crea un gruppo di risorse.

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

Creare un ambiente con un'area di lavoro Log Analytics generata automaticamente.

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

Mostra il dominio predefinito dell'ambiente dell'app contenitore. Annotare questo dominio da usare nelle sezioni successive.

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

Preparare l'app per la distribuzione

Quando distribuisci l'applicazione in App contenitore di Azure, l'URL di reindirizzamento diventa l'URL di reindirizzamento dell'istanza distribuita dell'app in App contenitore di Azure. Utilizza i passaggi seguenti per modificare le seguenti impostazioni nel file application.yml:

  1. Passa al file src\main\resources\application.yml della tua app e modifica il valore di impostandolo sul nome di dominio della tua app distribuita, come mostrato nell'esempio seguente. Assicurarsi di sostituire e con i valori effettivi. Ad esempio, con il dominio predefinito per il tuo ambiente di Azure Container Apps del passaggio precedente e come nome dell'app, useresti come valore di .

    post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
    
  2. Dopo aver salvato questo file, usare il comando seguente per ricompilare l'app:

    mvn clean package
    

Importante

Il file application.yml dell'applicazione contiene attualmente il valore del segreto del client nel parametro . Non è consigliabile mantenere questo valore in questo file. Se si esegue il commit del file in un repository Git, potrebbe anche essere rischioso. Per informazioni sull'approccio consigliato, vedi Gestire i segreti in App contenitore di Azure.

Aggiornare la registrazione dell'app Microsoft Entra ID

Poiché l'URI di reindirizzamento cambia nell'app distribuita in App Azure Container, è anche necessario modificare l'URI di reindirizzamento nella registrazione dell'app Microsoft Entra ID. Attenersi alla seguente procedura per apportare questa modifica:

  1. Passare alla pagina Registrazioni app della piattaforma di identità Microsoft per sviluppatori.

  2. Usa la casella di ricerca per cercare la registrazione dell'app, ad esempio .

  3. Aprire la registrazione dell'app selezionandone il nome.

  4. Seleziona Autenticazione dal menu.

  5. Nella sezione WebURI di reindirizzamento, selezionare Aggiungi URI.

  6. Compila l'URI della tua app, aggiungendo - ad esempio, .

  7. Seleziona Salva.

Distribuire l'app

Distribuire il pacchetto JAR in App contenitore di Azure.

Nota

Se necessario, è possibile specificare la versione JDK nelle variabili di ambiente di compilazione Java. Per altre informazioni, vedi Variabili di ambiente di compilazione per Java in App contenitore di Azure.

Ora è possibile distribuire il file WAR con il comando CLI .

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

Nota

La versione predefinita di JDK è 17. Se devi modificare la versione del JDK per garantire la compatibilità con la tua applicazione, puoi usare l'argomento per specificare il numero di versione.

Per ulteriori variabili di ambiente di compilazione, vedi Variabili di ambiente di compilazione per Java in App contenitore di Azure.

Convalidare l'app

In questo esempio, il comando include l'argomento , che restituisce il nome di dominio completo (FQDN), noto anche come URL dell'app. Usare la procedura seguente per controllare i log dell'app per analizzare eventuali problemi di distribuzione:

  1. Accedi all'URL di output dell'applicazione dalla pagina Output della sezione Distribuzione.

  2. Nel riquadro di spostamento della pagina Panoramica dell'istanza di App contenitore di Azure, seleziona Log per controllare i log dell'app.

Esaminare l'esempio

Per esplorare l'esempio, seguire questa procedura:

  1. Notare lo stato di accesso o di disconnessione visualizzato al centro dello schermo.
  2. Selezionare il pulsante sensibile al contesto nell'angolo. Questo pulsante mostra Accedi quando avvii l'app per la prima volta. In alternativa, seleziona il collegamento a i dettagli del token. Poiché questa pagina è protetta e richiede l'autenticazione, si viene reindirizzati automaticamente alla pagina di accesso.
  3. Nella pagina successiva seguire le istruzioni e accedere con un account del provider di identità scelto. È anche possibile scegliere di iscriversi o accedere a un account locale nel tenant B2C usando un indirizzo di posta elettronica.
  4. Al termine del flusso di accesso, si dovrebbe essere reindirizzati alla home page, che mostra lo stato di accesso o la pagina dei dettagli del token, a seconda del pulsante che ha attivato il flusso di accesso.
  5. Si noti che il pulsante sensibile al contesto ora indica Disconnetti e visualizza il nome utente.
  6. Se sei nella pagina iniziale, seleziona ID Token Details per visualizzare alcuni dei claim decodificati del token ID.
  7. Modificare il profilo. Selezionare Modifica profilo per modificare i dettagli, ad esempio il nome visualizzato, il luogo di residenza e la professione.
  8. Usare il pulsante nell'angolo per disconnettersi. La pagina di stato riflette il nuovo stato.

Informazioni sul codice

Questo esempio illustra come utilizzare Azure AD B2C Spring Boot Starter client library for Java per consentire agli utenti di accedere al proprio tenant Azure AD B2C. L'esempio usa anche gli starter Spring Oauth2 Client e Spring Web Boot. L'esempio usa le attestazioni del token ID ottenuto da Azure AD B2C per visualizzare i dettagli dell'utente connesso.

Contenuto

La tabella seguente illustra il contenuto della cartella del progetto di esempio:

File/cartella Descrizione
pom.xml Dipendenze dell'applicazione.
src/main/resources/templates/ Modelli thymeleaf per l'interfaccia utente.
src/main/resources/application.yml Configurazione della libreria Application e Microsoft Entra Boot Starter.
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ Questa directory contiene i principali punti di ingresso, controller e classi di configurazione dell'applicazione.
.../MsIdentitySpringBootWebappApplication.java Classe principale.
.../SampleController.java Controller con mappature degli endpoint.
.../SecurityConfig.java Configurazione di sicurezza, ad esempio le route che richiedono l'autenticazione.
.../Utilities.java Classe di utilità, ad esempio per filtrare le attestazioni del token ID.
CHANGELOG.md Elenco delle modifiche apportate all'esempio.
CONTRIBUTING.md Linee guida per contribuire all'esempio.
LICENZA La licenza per l'esempio.

Attestazioni del token ID

Per estrarre i dettagli del token, l'applicazione utilizza gli oggetti e di Spring Security in una mappatura delle richieste, come illustrato nell'esempio seguente, come illustrato nell'esempio seguente. Per informazioni complete su come questa app utilizza i claims del token ID, vedi Sample Controller.

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();
}

Per l'accesso, l'app effettua una richiesta all'endpoint di accesso di Azure AD B2C configurato automaticamente dalla libreria client Spring Boot Starter di Azure AD B2C per Java, come illustrato nell'esempio seguente:

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

Per disconnettersi, l'app effettua una richiesta POST all'endpoint , come mostrato nell'esempio seguente:

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

Elementi dell'interfaccia utente dipendenti dall'autenticazione

L'app ha una logica semplice nelle pagine del modello di interfaccia utente per determinare il contenuto da visualizzare in base all'autenticazione dell'utente, come illustrato nell'esempio seguente usando i tag 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>

Proteggere i percorsi con WebSecurityConfigurerAdapter

Per impostazione predefinita, l'app protegge la pagina ID Token Details in modo che solo gli utenti che hanno effettuato l'accesso possano accedervi. L'app configura questi percorsi a partire dalla proprietà nel file application.yml. Per configurare i requisiti specifici dell'app, puoi estendere in una tua classe. Per un esempio, vedi la classe SecurityConfig di questa app, illustrata nel codice seguente:

@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
    }
}

Ulteriori informazioni

  • Piattaforma di identità Microsoft (Microsoft Entra ID per gli sviluppatori)
  • Panoramica di Libreria di Autenticazione Microsoft (MSAL)
  • Guida introduttiva: registrare un'applicazione con la piattaforma di identità Microsoft
  • Guida introduttiva: configurare un'applicazione client per accedere alle API Web
  • Comprendere le esperienze di consenso delle applicazioni in Microsoft Entra ID
  • Comprendere il consenso dell'utente e dell'amministratore
  • Oggetti applicazione ed entità servizio in Microsoft Entra ID
  • Cloud nazionali
  • Esempi di codice MSAL
  • Libreria client Spring Boot Starter di Microsoft Entra ID per Java
  • Libreria client Spring Boot Starter di Azure Active Directory B2C per Java
  • Microsoft Authentication Library per Java (MSAL4J)
  • MSAL4J Wiki
  • token ID
  • Token di accesso nella piattaforma di identità Microsoft

Per altre informazioni su come funzionano i protocolli OAuth 2.0 in questo scenario e in altri scenari, vedere Scenari di autenticazione per Microsoft Entra ID.