Condividi tramite


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 di Azure Active Directory B2C usando la libreria client Spring Boot Starter di Azure AD B2C per Java. Usa il protocollo OpenID Connect.

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

Consigli

  • Una certa familiarità con Spring Framework.
  • Una certa familiarità con il terminale Linux/OSX.
  • jwt.ms per controllare i token.
  • Fiddler per monitorare l'attività di rete e la risoluzione dei problemi.
  • Segui il blog di Microsoft Entra ID per rimanere aggiornato 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, passare al repository ms-identity-msal-java-samples , quindi scaricarlo come file .zip ed estrarlo nel 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, vedere la sezione Registrare l'app . In caso contrario, continuare con i passaggi nella sezione Esegui l'esempio .

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

Per scegliere il tenant, seguire questa procedura:

  1. Accedere 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 l'iscrizione, 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, vedere 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 immettere un nome di applicazione significativo da visualizzare agli utenti dell'app, java-spring-webapp-auth-b2cad esempio .
    • Sotto Tipi di account supportati, seleziona Account in qualsiasi provider di identità o directory dell'organizzazione (per autenticare gli utenti con flussi utente).
    • Nella sezione URI di reindirizzamento (facoltativo) selezionare Web nella casella combinata e immettere l'URI di reindirizzamento seguente: http://localhost:8080/login/oauth2/code/.
  4. Selezionare Registra per creare l'applicazione.

  5. Nella pagina di registrazione dell'app trovare e copiare il valore ID applicazione (client) da usare in un secondo momento. 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 delle durate disponibili in base ai problemi di sicurezza, ad esempio In 2 anni.

  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.

Configurare l'app (java-spring-webapp-auth-b2c) per usare la registrazione dell'app

Usare la procedura seguente per configurare l'app:

Nota

Nei passaggi seguenti è ClientID uguale Application ID a o AppId.

  1. Aprire il progetto nell'IDE.

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

  3. Trovare la client-id proprietà e sostituire il valore esistente con l'ID applicazione o clientId dell'applicazione java-spring-webapp-auth-b2c dal portale di Azure.

  4. Trovare la client-secret proprietà e sostituire il valore esistente con il valore salvato durante la creazione dell'applicazione java-spring-webapp-auth-b2c dal portale di Azure.

  5. Trovare la base-uri proprietà e sostituire le due istanze del valore fabrikamb2c con il nome del tenant di Azure AD B2C in cui è stata creata l'applicazione java-spring-webapp-auth-b2c nel portale di Azure.

  6. Trovare la sign-up-or-sign-in proprietà e sostituirla con il nome del criterio di iscrizione/accesso del flusso utente creato nel tenant di Azure AD B2C in cui è stata creata l'applicazione java-spring-webapp-auth-b2c nel portale di Azure.

  7. Trovare la profile-edit proprietà e sostituirla con il nome dei criteri del flusso utente di reimpostazione della password creati nel tenant di Azure AD B2C in cui è stata creata l'applicazione java-spring-webapp-auth-b2c nel portale di Azure.

  8. Trovare la password-reset proprietà e sostituirla con il nome del criterio di modifica del flusso utente del profilo creato nel tenant di Azure AD B2C in cui è stata creata l'applicazione java-spring-webapp-auth-b2c nel portale di Azure.

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

  10. Trovare i riferimenti ai b2c_1_susi flussi e b2c_1_edit_profile e sostituirli con i sign-up-sign-in flussi utente e profile-edit .

Eseguire l'esempio

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

Prerequisiti

Preparare il progetto Spring

Per preparare il progetto, seguire questa procedura:

  1. Usare il comando Maven seguente per compilare il progetto:

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

    mvn spring-boot:run
    

Attrezzaggio

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

Assicurarsi di eseguire l'ultima versione dell'interfaccia della riga di comando eseguire il comando di aggiornamento.

az upgrade

Installare o aggiornare quindi l'estensione App contenitore di Azure per l'interfaccia della riga di comando.

Se si ricevono errori relativi ai parametri mancanti quando si eseguono az containerapp comandi nell'interfaccia della riga di comando di Azure, assicurarsi di avere installato la versione più recente dell'estensione App Azure Container.

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 App contenitore, installare l'estensione App contenitore con --allow-preview true.

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

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

Nota

Le risorse di App contenitore di Azure sono state migrate dallo spazio dei nomi Microsoft.Web allo spazio dei nomi Microsoft.App. Per ulteriori dettagli, vedere Migrazione dello spazio dei nomi da Microsoft.Web a Microsoft.App nel mese di marzo 2022.

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

Creare l'ambiente App Azure Container

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 si distribuisce l'applicazione in App Azure Container, l'URL di reindirizzamento viene modificato nell'URL di reindirizzamento dell'istanza dell'app distribuita in App Azure Container. Usare la procedura seguente per modificare queste impostazioni nel file application.yml :

  1. Passare al file src\main\resources\application.yml dell'app e modificare il valore di post-logout-redirect-uri in base al nome di dominio dell'app distribuita, come illustrato nell'esempio seguente. Assicurarsi di sostituire <API_NAME> e <default-domain-of-container-app-environment> con i valori effettivi. Ad esempio, con il dominio predefinito per l'ambiente dell'app Azure Container del passaggio precedente e ms-identity-api per il nome dell'app, usare https://ms-identity-api.<default-domain> per il post-logout-redirect-uri valore .

    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 client nel client-secret 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 l'approccio consigliato, vedere Gestire i segreti nelle app Azure Container.

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 di Microsoft Identity Platform per sviluppatori.

  2. Usare la casella di ricerca per cercare la registrazione dell'app, java-servlet-webapp-authenticationad esempio .

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

  4. Seleziona Autenticazione dal menu.

  5. Nella sezione URI di reindirizzamento Web - selezionare Aggiungi URI.

  6. Compilare l'URI dell'app, aggiungendo /login/oauth2/code/ , ad esempio . https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/

  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, vedere Creare variabili di ambiente per Java in App Contenitore di Azure.

Ora è possibile distribuire il file WAR con il comando dell'interfaccia della riga di comando 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

Nota

La versione predefinita di JDK è 17. Se è necessario modificare la versione di JDK per la compatibilità con l'applicazione, è possibile usare l'argomento --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION> per modificare il numero di versione.

Per altre variabili di ambiente di compilazione, vedere Creare variabili di ambiente per Java in App Contenitore di Azure.

Convalidare l'app

In questo esempio il containerapp up comando include l'argomento --query properties.configuration.ingress.fqdn , 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. Accedere all'URL dell'applicazione di output dalla pagina Output della sezione Distribuzione .

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

Esaminare l'esempio

Per esplorare l'esempio, seguire questa procedura:

  1. Si noti lo stato di accesso o disconnesso visualizzato al centro della schermata.
  2. Selezionare il pulsante sensibile al contesto nell'angolo. Questo pulsante legge Accedi quando si esegue l'app per la prima volta. In alternativa, selezionare il collegamento ai 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 si è nella home page, selezionare ID Token Details (Dettagli token ID) per visualizzare alcune delle attestazioni decodificate 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 usare la libreria client Spring Boot Starter di Azure AD B2C per Java per consentire agli utenti di accedere al tenant di 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 mapping degli endpoint.
.../SecurityConfig.java Configurazione di sicurezza, ad esempio le route che richiedono l'autenticazione.
.../Utilities.java Classe di utilità, ad esempio attestazioni del token ID filtro.
CHANGELOG.md Elenco delle modifiche apportate all'esempio.
CONTRIBUTING.md Linee guida per contribuire all'esempio.
LICENZA Licenza per l'esempio.

Attestazioni del token ID

Per estrarre i dettagli del token, l'app usa l'oggetto e OidcUser di AuthenticationPrincipal Spring Security in un mapping delle richieste, come illustrato nell'esempio seguente, come illustrato nell'esempio seguente. Per informazioni dettagliate su come questa app usa le attestazioni del token ID, vedi Controller di esempio.

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 la disconnessione, l'app effettua una richiesta POST all'endpoint logout , come illustrato 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 le route con WebSecurityConfigurerAdapter

Per impostazione predefinita, l'app protegge la pagina Id Token Details (Dettagli token ID) in modo che solo gli utenti connessi possano accedervi. L'app configura queste route dalla app.protect.authenticated proprietà dal file application.yml . Per configurare i requisiti specifici dell'app, è possibile estendere WebSecurityConfigurerAdapter in una delle classi. Per un esempio, vedi la classe SecurityConfig dell'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

Per altre informazioni sul funzionamento dei protocolli OAuth 2.0 in questo scenario e in altri scenari, vedere Scenari di autenticazione per Microsoft Entra ID.