Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra un'app Web Java Spring Boot che consente agli utenti di accedere nel tenant di Microsoft Entra ID usando la libreria client Microsoft Entra ID Spring Boot Starter client library for Java. Usa il protocollo OpenID Connect.
Il diagramma seguente illustra la topologia dell'app:
L'app client usa la libreria client Microsoft Entra ID Spring Boot Starter per Java per consentire l'accesso a un utente e ottenere un token ID da Microsoft Entra ID. Il token ID dimostra che l'utente è autenticato con Microsoft Entra ID e consente all'utente di accedere alle route protette.
Prerequisiti
- versione 17 di JDK. Questo esempio è stato sviluppato in un sistema con Java 17, 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.
- Tenant di Microsoft Entra ID. Per altre informazioni, vedi Come ottenere un tenant di Microsoft Entra ID.
- Un account utente nel tenant di Microsoft Entra ID. Questo esempio non funziona con un account Microsoft personale. Pertanto, se hai effettuato l'accesso al portale di Azure con un account personale e non hai un account utente nella tua directory, devi crearne uno ora.
- 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 controllare i 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
In alternativa, passare al repository ms-identity-msal-java-samples, quindi scaricarlo come file .zip ed estrarlo sul disco rigido.
Importante
Per evitare limitazioni di lunghezza del percorso in Windows, è consigliabile clonare in una directory vicina alla radice dell'unità.
Registrare le applicazioni di esempio nel tenant Microsoft Entra ID
In questo esempio è presente un progetto. Le sezioni seguenti illustrano come registrare l'app usando il portale di Azure.
Scegliere il tenant microsoft Entra ID in cui si desidera creare le applicazioni
Per scegliere il tenant, seguire questa procedura:
Accedere al portale di Azure.
Se l'account è presente in più tenant di Microsoft Entra ID, selezionare il profilo nell'angolo del portale di Azure e quindi selezionare Cambia directory per modificare la sessione nel tenant di Microsoft Entra ID desiderato.
Registrare l'app (java-spring-webapp-auth)
Per registrare l'app, seguire questa procedura:
Passare al portale di Azure e selezionare Microsoft Entra ID.
Selezionare Registrazioni app nel riquadro di spostamento, quindi selezionare Nuova registrazione.
Nella pagina Registra un'applicazione visualizzata immettere le informazioni di registrazione dell'applicazione seguenti:
- Nella sezione Name, immetti un nome significativo per l'applicazione da mostrare agli utenti dell'app, ad esempio
java-spring-webapp-auth. - In Tipi di account supportati selezionare Solo tenant singolo - TENANT_NAME (
TENANT_NAMEvaria per tenant). - Nella sezione URI di reindirizzamento (facoltativo), seleziona Web nella casella combinata e inserisci il seguente URI di reindirizzamento:
http://localhost:8080/login/oauth2/code/.
- Nella sezione Name, immetti un nome significativo per l'applicazione da mostrare agli utenti dell'app, ad esempio
Selezionare Registra per creare l'applicazione.
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.
Nella pagina di registrazione dell'app selezionare Certificati e segreti nel riquadro di spostamento per aprire la pagina in cui è possibile generare segreti e caricare i certificati.
Nella sezione Segreti client seleziona Nuovo segreto client.
Digitare una descrizione, ad esempio il segreto dell'app.
Selezionare una delle durate disponibili: consigliata: 180 giorni (6 mesi),90 giorni (3 mesi),365 giorni (12 mesi),545 giorni (18 mesi) o 730 giorni (24 mesi).
Selezionare Aggiungi. Viene visualizzato il valore generato.
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) per usare la registrazione dell'applicazione
Usare la procedura seguente per configurare l'app:
Nota
Nei passaggi seguenti, ClientID corrisponde a Application ID o AppId.
Aprire il progetto nell'IDE.
Apri il file src\main\resources\application.yml.
Individua il segnaposto
Enter_Your_Tenant_ID_Heree sostituisci il valore esistente con l'ID del tenant di Microsoft Entra.Trovare il segnaposto
Enter_Your_Client_ID_Heree sostituire il valore esistente con l'ID applicazione dell'appjava-spring-webapp-authoclientIdcopiato dal portale di Azure.Individuare il segnaposto
Enter_Your_Client_Secret_Heree sostituire il valore esistente con il valore salvato durante la creazione dijava-spring-webapp-auth, copiato dal portale di Azure.
Esegui l'esempio
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
ContributoroOwnerper la sottoscrizione di Azure. Per ulteriori informazioni, vedere Assegnare i 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
0.3.47o versione successiva. Per installare la versione più recente, usa il comandoaz extension add --name containerapp --upgrade --allow-preview. - Il Java Development Kit, versione 17 o successiva.
- Maven.
Preparare il progetto Spring
Per preparare il progetto, seguire questa procedura:
Usa il seguente comando Maven per compilare il progetto:
mvn clean verifyEseguire 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 a riga di comando.
Se si ricevono errori relativi a parametri mancanti quando si eseguono i comandi az containerapp in interfaccia della riga di comando di Azure, assicurarsi di avere installato la versione più recente dell'estensione 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à in anteprima di Container Apps, installa l'estensione di Container Apps con --allow-preview true.
az extension add --name containerapp --upgrade --allow-preview true
Ora che l'estensione o il modulo corrente è installato, registrare i namespace 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 altre informazioni, vedere Migrazione dello spazio dei nomi 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 cambia nell'URL di reindirizzamento dell'istanza distribuita dell'app in App contenitore di Azure. Utilizza i passaggi seguenti per modificare queste impostazioni nel file application.yml:
Vai al file src\main\resources\application.yml della tua app e modifica il valore di
post-logout-redirect-uriimpostandolo sul nome di dominio della tua app distribuita, come mostrato nell'esempio seguente. Assicurati di sostituire<API_NAME>e<default-domain-of-container-app-environment>con i valori effettivi. Ad esempio, con il dominio predefinito per il tuo ambiente di Azure Container Apps del passaggio precedente ems-identity-apicome nome dell'app, userestihttps://ms-identity-api.<default-domain>come valore dipost-logout-redirect-uri.post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>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 parametro client-secret. 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 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:
Passa alla pagina Registrazioni app della piattaforma di identità Microsoft per sviluppatori.
Usa la casella di ricerca per cercare la registrazione dell’applicazione, ad esempio,
java-servlet-webapp-authentication.Aprire la registrazione dell'app selezionandone il nome.
Seleziona Autenticazione dal menu.
Nella sezione Web - URI di reindirizzamento, seleziona Aggiungi URI.
Inserisci l'URI dell'app, aggiungendo
/login/oauth2/code/; ad esempio,https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/.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 ulteriori 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.
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 --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION> per regolare il numero di versione.
Per altre 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 containerapp up include l'argomento --query properties.configuration.ingress.fqdn, che restituisce il nome di dominio completo (FQDN), detto anche URL dell'app. Usare la procedura seguente per controllare i log dell'app per analizzare eventuali problemi di distribuzione:
Accedi all'URL di output dell'applicazione dalla pagina Outputs della sezione Deployment.
Nel riquadro di navigazione della pagina Overview dell'istanza di App contenitore di Azure, selezionare Logs per verificare i log dell'app.
Esaminare l'esempio
Per esplorare l'esempio, seguire questa procedura:
- Notare lo stato di accesso o di disconnessione visualizzato al centro dello schermo.
- Selezionare il pulsante sensibile al contesto nell'angolo. Questo pulsante riporta Accedi quando avvii l'app per la prima volta. In alternativa, selezionare dettagli del token. Poiché questa pagina è protetta e richiede l'autenticazione, si viene reindirizzati automaticamente alla pagina di accesso.
- Nella pagina successiva, segui le istruzioni e accedi con un account nel tenant di Microsoft Entra ID.
- Nella schermata di consenso notare gli ambiti richiesti.
- 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.
- Si noti che il pulsante sensibile al contesto ora indica Disconnetti e visualizza il nome utente.
- Se ti trovi nella home page, seleziona ID Token Details per visualizzare alcune delle attestazioni decodificate del token ID.
- Usare il pulsante nell'angolo per disconnettersi. La pagina di stato riflette il nuovo stato.
Informazioni sul codice
Questo esempio mostra come usare la libreria client per Java Microsoft Entra ID Spring Boot Starter per consentire agli utenti di accedere al tenant di Microsoft Entra ID. L'esempio usa anche gli starter Spring Oauth2 Client e Spring Web Boot. L'esempio usa attestazioni del token ID ottenuto da Microsoft Entra ID 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 Boot Starter per l'applicazione e Microsoft Entra ID. |
| 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 mappatura degli endpoint. |
| .../SecurityConfig.java | Configurazione di sicurezza, ad esempio le route che richiedono l'autenticazione. |
| .../Utilities.java | Classe di utilità, ad esempio per filtrare i claim del token ID. |
| CHANGELOG.md | Elenco delle modifiche apportate all'esempio. |
| CONTRIBUTING.md | Linee guida per contribuire all'esempio. |
| LICENZA | La licenza dell'esempio. |
Attestazioni contenute nel token ID
Per estrarre i dettagli del token, l'app utilizza gli oggetti AuthenticationPrincipal e OidcUser di Spring Security in un mapping di richiesta, come mostrato nell'esempio seguente. Vedi il Controller di esempio per i dettagli completi su come questa app utilizza i claims del token ID.
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();
}
Collegamenti di accesso e disconnessione
Per l'accesso, l'app effettua una richiesta all'endpoint di accesso di Microsoft Entra ID configurato automaticamente dalla libreria client Spring Boot Starter per Microsoft Entra ID per Java, come illustrato nell'esempio seguente:
<a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>
Per disconnettersi, l'app effettua una richiesta POST all'endpoint logout, 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 AADWebSecurityConfigurerAdapter
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 utilizzando la proprietà app.protect.authenticated del file application.yml. Per configurare i requisiti specifici dell'app, applica il metodo AadWebApplicationHttpSecurityConfigurer#aadWebApplication all'istanza HttpSecurity. Per un esempio, vedi la classe SecurityConfig di questa app, mostrata nel codice seguente:
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
@Value("${app.protect.authenticated}")
private String[] allowedOrigins;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
.and()
.authorizeHttpRequests(auth -> auth
.requestMatchers(allowedOrigins).authenticated()
.anyRequest().permitAll()
);
// @formatter:on
return http.build();
}
@Bean
@RequestScope
public ServletUriComponentsBuilder urlBuilder() {
return ServletUriComponentsBuilder.fromCurrentRequest();
}
}
Ulteriori informazioni
- Microsoft Identity Platform (Microsoft Entra ID per 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 per le 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
- 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.