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'applicazione web Java Spring Boot che consente agli utenti di accedere e ottiene un token di accesso per chiamare Microsoft Graph. Usa la libreria client Microsoft Entra ID Spring Boot Starter per Java per l'autenticazione, l'autorizzazione e l'acquisizione dei token. Usa Microsoft Graph SDK per Java per ottenere dati da Graph.
Il diagramma seguente illustra la topologia dell'app:
Diagramma che mostra la topologia dell'app.
L'app usa la libreria client Spring Boot Starter di Microsoft Entra ID per Java per ottenere un token di accesso per Microsoft Graph da Microsoft Entra ID. Il token di accesso dimostra che l'utente è autorizzato ad accedere all'endpoint dell'API Microsoft Graph come definito nell'ambito.
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.
- Tenant di Microsoft Entra ID. Per altre informazioni, vedere 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 si è effettuato l'accesso al portale di Azure con un account personale e non si dispone di un account utente nella directory, è necessario 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 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/2-Authorization-I/call-graph
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.
Registrare le applicazioni di esempio nel tenant di 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:
Accedi 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-call-graph)
Per registrare l'app, seguire questa procedura:
Passare al portale di Azure e selezionare Microsoft Entra ID.
Selezionare Registrazioni app nel riquadro di spostamento e 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 visualizzare agli utenti dell'app, ad esempio .
- In Tipi di account supportati, seleziona Account solo in questa directory dell'organizzazione.
- Nella sezione URI di reindirizzamento (facoltativo), seleziona Web nella casella combinata e immetti il seguente URI di reindirizzamento: .
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 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.
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.
Nella pagina di registrazione dell'app selezionare il riquadro Autorizzazioni API nel riquadro di spostamento per aprire la pagina per l'accesso alle API necessarie per l'applicazione.
Selezionare Aggiungi autorizzazioni e quindi assicurarsi che la scheda API Microsoft sia selezionata.
Nella sezione API Microsoft più usate selezionare Microsoft Graph.
Nella sezione Autorizzazioni delegate, selezionare User.Read dall'elenco. Se necessario, usare la casella di ricerca.
Selezionare Aggiungi autorizzazioni.
Configura l'app (java-spring-webapp-call-graph) per usare la tua registrazione dell'app
Usare la procedura seguente per configurare l'app:
Nota
Nei passaggi seguenti, indica lo stesso valore di o .
Aprire il progetto nell'IDE.
Aprire il file src\main\resources\application.yml.
Trova il segnaposto e sostituisci il valore esistente con l'ID del tenant di Microsoft Entra.
Individuare il segnaposto e sostituire il valore esistente con l'ID dell'applicazione o dell'app copiata dal portale di Azure.
Individua il segnaposto e sostituisci il valore esistente con il valore salvato durante la creazione di , copiato dal portale di Azure.
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
ContributoroOwnerper la sottoscrizione di Azure. Per altre informazioni, vedere Assegnare i ruoli di Azure tramite il portale di Azure. - The interfaccia della riga di comando di Azure.
- L'estensione dell'interfaccia della riga di comando (CLI) di App contenitore di Azure, versione o superiore. 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:
Usa il seguente comando Maven per eseguire la build del 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 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:
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>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:
Passare alla pagina Registrazioni app della piattaforma di identità Microsoft per sviluppatori.
Usa la casella di ricerca per cercare la registrazione dell'app, ad esempio .
Aprire la registrazione dell'app selezionandone il nome.
Seleziona Autenticazione dal menu.
Nella sezione WebURI di reindirizzamento, selezionare Aggiungi URI.
Compila l'URI della tua app, aggiungendo - ad esempio, .
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:
Accedi all'URL di output dell'applicazione dalla pagina Output della sezione Distribuzione.
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:
- Notare lo stato di accesso o di disconnessione visualizzato al centro dello schermo.
- Selezionare il pulsante sensibile al contesto nell'angolo. Questo pulsante mostra Accedi quando avvii l'app per la prima volta. In alternativa, seleziona i dettagli del token o il grafo delle chiamate. Poiché questa pagina è protetta e richiede l'autenticazione, si viene reindirizzati automaticamente alla pagina di accesso.
- Nella pagina successiva seguire le istruzioni e accedere con un account di Microsoft Entra ID tenant.
- 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 una delle altre pagine, 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 sei nella pagina iniziale, seleziona ID Token Details per visualizzare alcuni dei claim decodificati del token ID.
- Selezionare Call Graph per effettuare una chiamata all'endpoint /me di Microsoft Graph e visualizzare alcuni dettagli dell'utente ottenuti.
- 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 Microsoft Entra ID Spring Boot Starter per Java per consentire agli utenti di effettuare l'accesso nel tenant Microsoft Entra ID e ottenere un token di accesso per chiamare Microsoft Graph. L'esempio usa anche gli starter Spring Oauth2 Client e Spring Web Boot.
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 dell'applicazione e della libreria starter di avvio di 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 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'app utilizza l'oggetto e di Spring Security in una mappatura di richiesta, come mostrato nell'esempio seguente. Vedere il controller di esempio per i dettagli completi su come questa app utilizza le attestazioni contenute nel 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 , 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>
Proteggi le route con AADWebSecurityConfigurerAdapter
Per impostazione predefinita, l'app protegge le pagine Dettagli del token ID e Grafo delle chiamate 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 della tua app, puoi estendere in una delle tue classi. Per un esempio, vedi la classe SecurityConfig di questa app, illustrata nel codice seguente:
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends AADWebSecurityConfigurerAdapter{
@Value( "${app.protect.authenticated}" )
private String[] protectedRoutes;
@Override
public void configure(HttpSecurity http) throws Exception {
// use required configuration form AADWebSecurityAdapter.configure:
super.configure(http);
// add custom configuration:
http.authorizeRequests()
.antMatchers(protectedRoutes).authenticated() // limit these pages to authenticated users (default: /token_details, /call_graph)
.antMatchers("/**").permitAll(); // allow all other routes.
}
}
Grafo delle chiamate
Quando l'utente passa a , l'applicazione crea un'istanza di utilizzando un o preparato dal boot starter di Microsoft Entra ID. L'app chiede a di chiamare l'endpoint e visualizza i dettagli dell'utente attualmente connesso. proviene da Microsoft Graph SDK per Java, v3.
deve essere preparato con gli scope corretti. Consultare il file application.yml e la seguente sezione Scopes. L'elemento viene usato per recuperare il token di accesso e inserirlo nell'intestazione delle richieste , come mostrato nell'esempio seguente:
//see SampleController.java
@GetMapping(path = "/call_graph")
public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graphAuthorizedClient) {
// See the Utilities.graphUserProperties() method for the full example of the following operation:
GraphServiceClient graphServiceClient = Utilities.getGraphServiceClient(graphAuthorizedClient);
User user = graphServiceClient.me().buildRequest().get();
return user.displayName;
}
L'esempio seguente del file di application.yml mostra gli ambiti richiesti:
# see application.yml file
authorization-clients:
graph:
# Specifies the Microsoft Graph scopes that your app needs access to:
scopes: https://graph.microsoft.com/User.Read
Ambiti
Autorizzazioni specificano a Microsoft Entra ID il livello di accesso richiesto dall'applicazione. Per gli ambiti di Microsoft Graph richiesti da questa applicazione, vedere application.yml.
Per impostazione predefinita, l'applicazione imposta il valore di scopes su . L'ambito serve per accedere alle informazioni dell'utente attualmente connesso dall'endpoint /me. Le richieste valide per l'endpoint /me endpoint devono contenere l'ambito .
Quando un utente accede, Microsoft Entra ID presenta un dialogo di consenso all'utente in base agli ambiti richiesti dall'applicazione. Se l'utente acconsente a uno o più ambiti e ottiene un token, gli ambiti con il consenso vengono codificati nel token di accesso risultante.
In questa app, visualizza il token di accesso che dimostra a quali ambiti l'utente ha acconsentito. L'app utilizza questo token per creare un'istanza di che gestisce le richieste a Graph.
Utilizzando , viene creata una richiesta e inviata a . Il token di accesso viene inserito nell'intestazione della richiesta.
Ulteriori informazioni
- Documentazione di Microsoft Identity Platform
- 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 Azure Active Directory 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.