Condividi tramite


Aggiungere l'accesso con Azure Active Directory B2C a un'app Web Spring

Questo articolo illustra come creare un'app Java con funzionalità di accesso usando Spring Initializr con Spring Boot Starter per Microsoft Entra ID.

In questa esercitazione si apprenderà come:

  • Creare un'applicazione Java usando Spring Initializr
  • Configurare Azure Active Directory B2C
  • Proteggere l'applicazione con classi e annotazioni Spring Boot
  • Compilare e testare l'applicazione Java

microsoft Entra ID è la soluzione di gestione delle identità aziendali su scala cloud di Microsoft. Azure Active Directory B2C integra il set di funzionalità di Microsoft Entra ID, consentendo di gestire l'accesso di clienti, consumatori e cittadini alle applicazioni business-to-consumer (B2C).

Prerequisiti

  • Una sottoscrizione di Azure. Se non ne hai già uno, crea un account gratuito prima di iniziare.
  • Kit di sviluppo Java (JDK) supportato. Per altre informazioni sui JDK disponibili per lo sviluppo in Azure, vedere supporto Java in Azure e Azure Stack.
  • Apache Maven, versione 3.0 o successiva.

Importante

Spring Boot versione 2.5 o successiva è necessaria per completare i passaggi descritti in questo articolo.

Creare un'app con Spring Initializr

  1. Passare a https://start.spring.io/.

  2. Compilare i valori in base a queste indicazioni. Le etichette e il layout possono differire dall'immagine mostrata qui.

    • In Progetto, selezionare Progetto Maven.
    • In Languageselezionare Java.
    • In Spring Bootselezionare 2.7.11.
    • In Group, Artifact e Name inserire lo stesso valore usando una stringa descrittiva breve. L'interfaccia utente può compilare automaticamente alcuni di questi campi durante la digitazione.
    • Nel riquadro Dipendenze, selezionare Aggiungi dipendenze. Usare l'interfaccia utente per aggiungere dipendenze da Spring Web e Spring Security.

    Nota

    Spring Security 5.5.1, 5.4.7, 5.3.10 e 5.2.11 sono stati rilasciati per risolvere il seguente report CVE CVE-2021-22119: Attacco Denial-of-Service con spring-security-oauth2-client. Se si usa la versione precedente, aggiornarla.

  3. Selezionare Genera progetto, e quindi scaricare il progetto in un percorso sul computer locale. Spostare il file scaricato in una directory denominata dopo il progetto e decomprimere il file. Il layout del file dovrebbe assomigliare a quanto segue, con il valore che hai inserito per Group al posto di 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
    

Creare e inizializzare un'istanza di Microsoft Entra

Creare l'istanza di Active Directory

  1. Accedere a https://portal.azure.com.

  2. Seleziona Crea una risorsa. Cerca Azure Active Directory B2C.

    Creare una nuova istanza di Azure Active Directory B2C usando il portale di Azure.

  3. Selezionare Crea.

    inserzione di Azure Marketplace per Azure Active Directory B2C.

  4. Selezionare Crea un nuovo tenant Azure AD B2C.

    'opzione del portale di Azure per creare un nuovo tenant di Azure AD B2C.

  5. Per Nome organizzazione e Nome di dominio iniziale, inserire i valori appropriati, poi selezionare Crea.

    schermata Crea tenant di Azure AD B2C.

  6. Quando la creazione di Active Directory è completata, selezionare il proprio account nell'angolo in alto a destra, selezionare Cambia directory, quindi selezionare la directory creata. Si verrà reindirizzati alla home page del nuovo tenant. Cercare quindi b2c e selezionare Azure AD B2C.

    Individuare il servizio Azure AD B2C.

Aggiungere una registrazione di applicazione per l'app Spring Boot

  1. Nel riquadro Gestisci, seleziona Registrazioni app, quindi seleziona Nuova registrazione.

    Screenshot del portale di Azure che mostra la schermata Registrazioni app di Azure AD B2C.

  2. Nel campo Nome inserire il nome dell'app e quindi selezionare Registra.

    Registrare un modulo di applicazione Azure AD B2C.

  3. Tornare al riquadro Gestione, selezionare Registrazioni appe quindi selezionare il nome dell'applicazione che hai creato.

    schermata Registrazioni app con display name selezionato.

  4. Selezionare Authentication, quindi Aggiungi una piattaforma e quindi Web. Imposta i Redirect URI su http://localhost:8080/login/oauth2/code/, quindi seleziona Configura.

    Opzioni selezionate per l'autenticazione, aggiungere una piattaforma web.

    Configura la schermata Web con il campo URI di reindirizzamento selezionato.

Aggiungere segreti per la tua app

Selezionare Certificati & segreti, quindi Nuovi segreti del client. Immettere la descrizione del segreto e quindi selezionare Aggiungi. Dopo aver creato il segreto, selezionare l'icona di copia accanto al valore del segreto per copiare il valore da usare più avanti in questo articolo.

Aggiungi un segreto client schermata.

schermata Certificati e segreti con il pulsante Copia selezionato.

Nota

Se lasci la sezione Certificati & segreti e torni indietro, non potrai visualizzare il valore segreto. In tal caso, è necessario creare un altro segreto e copiarlo per un uso futuro. In alcuni casi, il valore del segreto generato può contenere caratteri problematici per l'inclusione nel file application.yml, come il backslash o il backtick. In tal caso, eliminare il segreto e generarne un altro.

Aggiungi il flusso dell'utente

  1. Passare alla pagina principale del locatario. Nella sezione criteri del riquadro sinistro, selezionare Flussi utente, quindi selezionare Nuovo flusso utente.

  2. A questo punto si lascerà questa esercitazione, si eseguirà un'altra esercitazione e si tornerà a questa esercitazione al termine. Ecco alcuni aspetti da tenere presente quando si passa all'altra esercitazione.

    • Iniziare con il passaggio che richiede di selezionare Nuovo flusso utente.
    • Quando questa esercitazione fa riferimento a webapp1, usare invece il valore immesso per Group.
    • Quando si selezionano le attestazioni da restituire dai flussi, assicurarsi che sia selezionato Display Name. Senza questa attestazione, l'app creata in questa guida non funzionerà.
    • Quando viene chiesto di eseguire i flussi utente, l'URL di reindirizzamento specificato in precedenza non è ancora attivo. È comunque possibile eseguire i flussi, ma il reindirizzamento non verrà completato correttamente. Questo è previsto.
    • Al raggiungimento di "Passaggi successivi", torna a questo tutorial.

    Seguire tutti i passaggi descritti in Esercitazione: Creare flussi utente in Azure Active Directory B2C per creare flussi utente per l'iscrizione e l'accesso, la modifica del profilo e la reimpostazione della password.

    Azure AD B2C supporta account locali e provider di identità social. Per un esempio di creazione di un provider di identità GitHub, vedere Configurare l'iscrizione e l'accesso con un account GitHub usando Azure Active Directory B2C.

Configurare e compilare l'app

Dopo aver creato l'istanza di Azure AD B2C e alcuni flussi utente, si connetterà l'app Spring all'istanza di Azure AD B2C.

  1. Dalla riga di comando, vai nella directory dove hai decompresso il file .zip scaricato da Spring Initializr.

  2. Passare alla cartella padre per il progetto e aprire il file di progetto pom.xml Maven in un editor di testo.

  3. Aggiungere le dipendenze per la sicurezza di Spring OAuth2 al 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>
    

    Per il spring-cloud-azure-starter-active-directory-b2c, utilizzare la versione più recente disponibile. Potrebbe essere possibile usare mvnrepository.com per cercarlo.

    Per il spring-boot-starter-thymeleafusare la versione corrispondente alla versione di Spring Boot selezionata in precedenza, ad esempio 2.3.4.RELEASE.

    Per thymeleaf-extras-springsecurity5, usare la versione più recente disponibile. Potrebbe essere possibile usare mvnrepository.com per cercarlo. A partire da questo articolo, la versione più recente è 3.0.4.RELEASE.

  4. Salvare e chiudere il file pom.xml.

    • Verificare che le dipendenze siano corrette eseguendo mvn -DskipTests clean install. Se non viene visualizzato BUILD SUCCESS, individua e risolvi il problema prima di continuare.
  5. Navigare alla cartella src/main/resources del progetto e creare un file application.yml in un editor di testo.

  6. Specificare le impostazioni per la registrazione dell'app usando i valori creati in precedenza; Per esempio:

    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> 
    

    Si noti che il valore client-secret è racchiuso tra virgolette singole. Questo è necessario perché il valore di <secret-value> conterrà quasi certamente alcuni caratteri che richiedono di essere racchiusi tra virgolette singole quando presenti in YAML.

    Nota

    A partire da questo articolo, l'elenco completo dei valori di Active Directory B2C Spring Integration disponibili per l'uso in application.yml è il seguente:

    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:
    

    Il file application.yml è disponibile nell' esempio di spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application su GitHub.

  7. Salvare e chiudere il file application.yml.

  8. Creare una cartella denominata controller in src/main/java/<yourGroupId>/<yourGroupId>, sostituendo <yourGroupId> con il valore immesso per Group.

  9. Creare un nuovo file Java denominato WebController.java nella cartella controller e aprirlo in un editor di testo.

  10. Immettere il codice seguente, modificando yourGroupId in modo appropriato, quindi salvare e chiudere il file:

    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";
        }
    }
    

    Poiché ogni metodo nel controller chiama initializeModel()e tale metodo chiama model.addAllAttributes(user.getAttributes());, qualsiasi pagina HTML in src/main/resources/templates è in grado di accedere a uno di questi attributi, ad esempio ${name}, ${grant_type}o ${auth_time}. I valori restituiti da user.getAttributes() sono infatti le attestazioni del id_token per l'autenticazione. L'elenco completo delle attestazioni disponibili è indicato nei token ID della piattaforma di identità Microsoft.

  11. Creare una cartella denominata security in src/main/java/yourGroupId/yourGroupId, sostituendo con il valore immesso per Group.

  12. Creare un nuovo file Java denominato WebSecurityConfiguration.java nella cartella di sicurezza e aprirlo in un editor di testo.

  13. Immettere il codice seguente, modificando yourGroupId in modo appropriato, quindi salvare e chiudere il file:

    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. Copiare il file home.html dall'esempio spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application nella cartella src/main/resources/templatese sostituire ${your-profile-edit-user-flow} e ${your-password-reset-user-flow} con i nomi dei flussi utente creati in precedenza.

Compilare e testare l'app

  1. Aprire un prompt dei comandi e passare alla cartella in cui si trova il file pom.xml dell'app.

  2. Compilare l'applicazione Spring Boot con Maven ed eseguirla; Per esempio:

    Nota

    È estremamente importante che l'ora secondo l'orologio di sistema, sotto cui viene eseguita l'applicazione Spring Boot locale, sia accurata. Quando si usa OAuth 2.0, la tolleranza al disallineamento dell'orologio è molto scarsa. Anche tre minuti di imprecisione possono causare il fallimento del login con un errore simile a [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. Al momento della stesura di questo testo, time.gov ha un indicatore di quanto il tuo orologio differisca dall'ora effettiva. L'app è stata eseguita correttamente con uno scostamento di +0,019 secondi.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. Dopo che l'applicazione è stata compilata e avviata da Maven, aprire http://localhost:8080/ in un Web browser; si dovrebbe essere reindirizzati alla pagina di accesso.

    pagina di accesso dell'app Web.

  4. Seleziona il collegamento con il testo relativo all'accesso al sistema. È necessario essere reindirizzati ad Azure AD B2C per avviare il processo di autenticazione.

  5. Dopo aver eseguito correttamente l'accesso, verrà visualizzato il home page di esempio dal browser.

    accesso dell'app Web completato.

Risoluzione dei problemi

Le sezioni seguenti descrivono come risolvere alcuni problemi che potrebbero verificarsi.

Nome attributo mancante negli attributi

Durante l'esecuzione dell'esempio, è possibile che venga generata un'eccezione con il messaggio Missing attribute 'name' in attributes. Il log per questa eccezione sarà simile all'output seguente:

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]

Se ricevi questo errore, verifica il flusso utente che hai creato in Esercitazione: Creare flussi utente in Azure Active Directory B2C. Quando si crea il flusso di lavoro utente, per attributi utente e attestazioni, assicurarsi di scegliere attributi e attestazioni per Nome visualizzato. Assicurarsi inoltre di configurare correttamente user-name-attribute-name nel file di application.yml.

Effettua l'accesso utilizzando i cicli all'endpoint B2C

Questo problema è probabilmente dovuto a cookie inquinanti per localhost. Elimina i cookie per localhost e riprova.

Sommario

In questa esercitazione è stata creata una nuova applicazione Web Java usando l'utilità di avvio Azure Active Directory B2C, è stato configurato un nuovo tenant di Azure AD B2C e è stata registrata una nuova applicazione e quindi è stata configurata l'applicazione in modo da usare le annotazioni e le classi Spring per proteggere l'app Web.

Pulire le risorse

Quando non è più necessario, usare il portale di Azure per eliminare le risorse create in questo articolo per evitare addebiti imprevisti.

Passaggi successivi

Per altre informazioni su Spring e Azure, passare al Centro documentazione di Spring in Azure.