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
Passare a https://start.spring.io/.
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.
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
Accedere a https://portal.azure.com.
Seleziona Crea una risorsa. Cerca Azure Active Directory B2C.
Selezionare Crea.
Selezionare Crea un nuovo tenant Azure AD B2C.
Per Nome organizzazione e Nome di dominio iniziale, inserire i valori appropriati, poi selezionare Crea.
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.
Aggiungere una registrazione di applicazione per l'app Spring Boot
Nel riquadro Gestisci, seleziona Registrazioni app, quindi seleziona Nuova registrazione.
Nel campo Nome inserire il nome dell'app e quindi selezionare Registra.
Tornare al riquadro Gestione, selezionare Registrazioni appe quindi selezionare il nome dell'applicazione che hai creato.
Selezionare Authentication, quindi Aggiungi una piattaforma e quindi Web. Imposta i Redirect URI su
http://localhost:8080/login/oauth2/code/
, quindi seleziona Configura.
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.
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
Passare alla pagina principale del locatario. Nella sezione criteri del riquadro sinistro, selezionare Flussi utente, quindi selezionare Nuovo flusso utente.
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.
Dalla riga di comando, vai nella directory dove hai decompresso il file .zip scaricato da Spring Initializr.
Passare alla cartella padre per il progetto e aprire il file di progetto pom.xml Maven in un editor di testo.
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-thymeleaf
usare la versione corrispondente alla versione di Spring Boot selezionata in precedenza, ad esempio2.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
.Salvare e chiudere il file pom.xml.
- Verificare che le dipendenze siano corrette eseguendo
mvn -DskipTests clean install
. Se non viene visualizzatoBUILD SUCCESS
, individua e risolvi il problema prima di continuare.
- Verificare che le dipendenze siano corrette eseguendo
Navigare alla cartella src/main/resources del progetto e creare un file application.yml in un editor di testo.
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.
Salvare e chiudere il file application.yml.
Creare una cartella denominata controller in src/main/java/<yourGroupId>/<yourGroupId>, sostituendo
<yourGroupId>
con il valore immesso per Group.Creare un nuovo file Java denominato WebController.java nella cartella controller e aprirlo in un editor di testo.
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 chiamamodel.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 dauser.getAttributes()
sono infatti le attestazioni delid_token
per l'autenticazione. L'elenco completo delle attestazioni disponibili è indicato nei token ID della piattaforma di identità Microsoft.Creare una cartella denominata
security in src/main/java/ , sostituendoyourGroupId / yourGroupId con il valore immesso per Group .Creare un nuovo file Java denominato
WebSecurityConfiguration.java nella cartella di sicurezzae aprirlo in un editor di testo. 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) ; } }
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
Aprire un prompt dei comandi e passare alla cartella in cui si trova il file pom.xml dell'app.
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
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.Seleziona il collegamento con il testo relativo all'accesso al sistema. È necessario essere reindirizzati ad Azure AD B2C per avviare il processo di autenticazione.
Dopo aver eseguito correttamente l'accesso, verrà visualizzato il
home page
di esempio dal browser.
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.