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 utilizza la libreria client Microsoft Entra ID Spring Boot Starter per Java per l'autenticazione, l'autorizzazione e l'acquisizione di token. L'app usa il protocollo OpenID Connect per consentire agli utenti di accedere e limita l'accesso ad alcune route utilizzando i ruoli dell'applicazione di Microsoft Entra ID (ruoli dell'app) per l'autorizzazione.
I ruoli dell'app, insieme ai gruppi di sicurezza, sono strumenti comuni per implementare l'autorizzazione. Usando il controllo degli accessi in base al ruolo (RBAC) con ruoli applicazione e attestazioni di ruolo, è possibile applicare in modo sicuro i criteri di autorizzazione con un impegno minimo. Un altro approccio consiste nell'usare i gruppi e le attestazioni di gruppo di Microsoft Entra ID. I gruppi e i ruoli dell'applicazione di Microsoft Entra ID non si escludono reciprocamente. È possibile usarli entrambi per fornire un controllo di accesso con granularità fine.
Per un video che tratta un caso simile, vedi Implementare l'autorizzazione nelle applicazioni usando i ruoli dell'applicazione, i gruppi di sicurezza, gli ambiti e i ruoli di directory.
Per altre informazioni su come funzionano i protocolli in questo e in altri scenari, vedere Autenticazione e autorizzazione.
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 consentire l'accesso a un utente e ottenere un token ID da Microsoft Entra ID. Il token ID contiene l'attestazione dei ruoli. L'applicazione esamina il valore di questa attestazione per determinare le pagine a cui l'utente è autorizzato ad accedere.
Questo tipo di autorizzazione viene implementato mediante RBAC. Con RBAC, un amministratore assegna le autorizzazioni ai ruoli, non ai singoli utenti o gruppi. L'amministratore può quindi assegnare ruoli a utenti e gruppi diversi per controllare chi può accedere a determinati contenuti e funzionalità.
Questa applicazione di esempio definisce i seguenti due ruoli dell'applicazione:
- : autorizzato ad accedere alle pagine Solo amministratori e Utenti normali.
- : Autorizzato ad accedere alla pagina Utenti normali.
Questi ruoli dell'applicazione sono definiti nel Azure portal nel manifesto di registrazione dell'applicazione. Quando un utente accede all'applicazione, Microsoft Entra ID genera un'attestazione di ruoli per ogni ruolo concesso singolarmente all'utente sotto forma di appartenenza al ruolo.
È possibile assegnare utenti e gruppi ai ruoli tramite il portale di Azure.
Nota
I claim di ruolo non sono presenti per gli utenti guest in un tenant se l'endpoint viene usato come autorità per consentire l'accesso agli utenti. È necessario far accedere un utente a un endpoint specifico del tenant come .
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/3-Authorization-II/roles
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 l'applicazione 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-roles)
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 Nome, immetti un nome significativo per l'applicazione da mostrare 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.
Definire i ruoli dell'app
Per definire i ruoli dell'app, seguire questa procedura:
Sempre nella stessa registrazione app, seleziona Ruoli app nel riquadro di navigazione.
Seleziona Crea ruolo app, quindi immetti i valori seguenti:
- Per Nome visualizzato, immetti un nome appropriato, ad esempio PrivilegedAdmin.
- Per Tipi di membri consentiti, scegliere Utente.
- Per Valore, immettere PrivilegedAdmin.
- Per Descrizione, immettere PrivilegedAdmins che possono visualizzare la Pagina di amministrazione.
Seleziona Crea ruolo app, quindi immetti i valori seguenti:
- Per Nome visualizzato, immetti un nome appropriato, ad esempio RegularUser.
- Per Tipi di membri consentiti, scegliere Utente.
- Per Valore, immettere RegularUser.
- Per Descrizione, immettere RegularUsers che possono visualizzare la pagina utente.
Selezionare Applica per salvare le modifiche.
Assegnare utenti ai ruoli dell'app
Per aggiungere utenti al ruolo dell'app definito in precedenza, seguire le linee guida qui: Assegnare utenti e gruppi ai ruoli.
Configura l'app (java-spring-webapp-roles) per utilizzare la 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.
Trovare il segnaposto e sostituire il valore esistente con l'ID dell'applicazione o dell'app copiato dal portale di Azure.
Individua il segnaposto e sostituisci il valore esistente con il valore che hai salvato durante la creazione di , copiato dal portale di Azure.
Aprire il file src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootapplication/Sample.Controller.java.
Trova in questo file i riferimenti ai ruoli dell'app e . Se necessario, modificarli in modo da riflettere i nomi dei ruoli dell'app scelti nei passaggi precedenti.
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 ulteriori informazioni, vedere Assegnare 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 o versione successiva. 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 dettagli del token, solo amministratori o utenti normali. Poiché queste pagine sono protette e richiedono 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 si è nella home page, selezionare ID Token Details per visualizzare alcuni dei claim decodificati del token ID, inclusi i ruoli.
- Seleziona Admins Only per visualizzare . Solo gli utenti con il ruolo app possono visualizzare questa pagina. In caso contrario, viene visualizzato un messaggio di errore di autorizzazione.
- Seleziona Regular Users per visualizzare la pagina . Solo gli utenti con il ruolo dell'app o possono visualizzare questa pagina. In caso contrario, viene visualizzato un messaggio di errore di autorizzazione.
- 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 Microsoft Entra ID Spring Boot Starter per Java 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 le attestazioni del token ID ottenuto da Microsoft Entra ID per visualizzare i dettagli dell'utente connesso e per limitare l'accesso ad alcune pagine usando l'attestazione dei ruoli per l'autorizzazione.
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. |
| LICENSE` | 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. Per tutti i dettagli su come questa app utilizza le attestazioni del token ID, vedi Sample Controller.
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();
}
Elaborare un'attestazione di ruoli nel token ID
L'attestazione dei ruoli del token include i nomi dei ruoli a cui è assegnato l'utente connesso, come illustrato nell'esempio seguente:
{
...
"roles": [
"PrivilegedAdmin",
"RegularUser",]
...
}
Un modo comune per accedere ai nomi dei ruoli è descritto nella sezione attestazioni del token ID.
Microsoft Entra ID Boot Starter v3.3 e versioni successive analizza automaticamente anche il claim dei ruoli e aggiunge ogni ruolo alle dell'utente connesso, anteponendo a ciascuno la stringa . Questa configurazione consente agli sviluppatori di utilizzare i ruoli dell'applicazione con le annotazioni condizionali di Spring tramite il metodo . Ad esempio, è possibile trovare le seguenti condizioni mostrate in SampleController.java:
@GetMapping(path = "/admin_only")
@PreAuthorize("hasAuthority('APPROLE_PrivilegedAdmin')")
public String adminOnly(Model model) {
// restrict to users who have PrivilegedAdmin app role only
}
@GetMapping(path = "/regular_user")
@PreAuthorize("hasAnyAuthority('APPROLE_PrivilegedAdmin','APPROLE_RegularUser')")
public String regularUser(Model model) {
// restrict to users who have any of RegularUser or PrivilegedAdmin app roles
}
Il codice seguente recupera un elenco completo di autorizzazioni per un dato utente:
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
Collection<? extends GrantedAuthority> authorities = principal.getAuthorities();
}
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 ID Token Details, Admins Only e Regular Users in modo che solo gli utenti connessi 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, /admin_only, /regular_user)
.antMatchers("/**").permitAll(); // allow all other routes.
}
}
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 e dell'entità servizio in Azure Active Directory
- 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.