Catene di credenziali nella libreria client di Identità di Azure per Java
La libreria client di Identità di Azure fornisce le credenziali, ovvero classi pubbliche che implementano l'interfaccia TokenCredential della libreria Core di Azure. Una credenziale rappresenta un flusso di autenticazione distinto per l'acquisizione di un token di accesso da Microsoft Entra ID. Queste credenziali si possono concatenare per formare una sequenza ordinata di meccanismi di autenticazione da tentare.
Funzionamento di una credenziale concatenata
In fase di esecuzione, una catena di credenziali tenta di eseguire l'autenticazione usando la prima credenziale della sequenza. Se tale credenziale non riesce ad acquisire un token di accesso, viene tentata la credenziale successiva nella sequenza e così via finché non viene ottenuto un token di accesso correttamente. Il diagramma di sequenza seguente illustra questo comportamento:
Perché usare le catene di credenziali
Una credenziale concatenata può offrire i vantaggi seguenti:
Riconoscimento dell'ambiente: seleziona automaticamente la credenziale più adeguata in base all'ambiente di esecuzione dell'app. Senza di essa, si dovrebbe scrivere un codice simile al seguente:
import com.azure.core.credential.TokenCredential; import com.azure.identity.AzureCliCredentialBuilder; import com.azure.identity.ManagedIdentityCredentialBuilder; // Code omitted for brevity TokenCredential credential = null; // Set up credential based on environment (Azure or local development) String environment = System.getenv("ENV"); if (environment != null && environment.equals("production")) { credential = new ManagedIdentityCredentialBuilder() .clientId(userAssignedClientId) .build(); } else { credential = new AzureCliCredentialBuilder() .build(); }
Transizioni lineari: l'app può passare dall'ambiente di sviluppo locale a quello di gestione temporanea o di produzione senza modificare il codice l'autenticazione.
Resilienza migliorata: include un meccanismo di fallback che passa alla credenziale successiva se quella precedente non riesce ad acquisire un token di accesso.
Come scegliere una credenziale concatenata
Esistono due filosofie diverse per il concatenamento delle credenziali:
- Usare una catena preconfigurata: iniziare con una catena con opinioni preconstruite che supporta gli scenari di autenticazione più comuni. Per questo approccio, vedere la sezione panoramica di DefaultAzureCredential.
- "Creare" una catena: iniziare da una catena vuota e includere solo ciò che serve. Per questo approccio, vedere la sezione panoramica di ChainedTokenCredential.
Panoramica di DefaultAzureCredential
DefaultAzureCredential è una catena di credenziali preconfigurata e vincolante. È progettata per supportare molti ambienti, insieme ai flussi di autenticazione e agli strumenti di sviluppo più comuni. Graficamente, la catena sottostante è simile alla seguente:
L'ordine in cui DefaultAzureCredential
tenta le credenziali.
Ordinamento | Credenziale | Descrizione |
---|---|---|
1 | Ambiente | Legge una raccolta di variabili di ambiente per determinare se un'entità servizio applicazione (utente applicazione) è configurata per l'app. In questo caso, DefaultAzureCredential usa questi valori per autenticare l'app in Azure. Questo metodo viene usato più spesso negli ambienti server, ma può essere usato anche durante lo sviluppo in locale. |
2 | Identità del carico di lavoro | Se l'app viene distribuita in un host di Azure con identità del carico di lavoro abilitata, autenticare l'account. |
3 | Identità gestita | Se l'app viene distribuita in un host di Azure con identità gestita abilitata, autentica l'app in Azure usando l'identità gestita. |
4 | Cache dei token condivisi | Se lo sviluppatore ha eseguito l'autenticazione in Azure accedendo a Visual Studio, autenticare l'app in Azure usando lo stesso account. (solo Windows). |
5 | IntelliJ | Se lo sviluppatore ha eseguito l'autenticazione tramite Azure Toolkit for IntelliJ, autenticare l'account. |
6 | Interfaccia della riga di comando di Azure | Se lo sviluppatore ha eseguito l'autenticazione in Azure usando il comando az login dell'interfaccia della riga di comando, autenticare l'app in Azure usando lo stesso account. |
7 | Azure PowerShell | Se lo sviluppatore ha eseguito l'autenticazione in Azure usando il cmdlet Connect-AzAccount di PowerShell, autenticare l'app in Azure usando lo stesso account. |
8 | Azure Developer CLI | Se lo sviluppatore ha eseguito l'autenticazione in Azure usando il comando azd auth login dell'interfaccia a riga di comando di Azure Developer, eseguire l'autenticazione con tale account. |
Nella sua forma più semplice, è possibile usare la versione senza parametri di DefaultAzureCredential
, come indicato di seguito:
import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
// Code omitted for brevity
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.build();
Panoramica di ChainedTokenCredential
ChainedTokenCredential è una catena vuota a cui aggiungere le credenziali in base alle esigenze dell'app. Ad esempio:
import com.azure.identity.AzureCliCredential;
import com.azure.identity.AzureCliCredentialBuilder;
import com.azure.identity.ChainedTokenCredential;
import com.azure.identity.ChainedTokenCredentialBuilder;
import com.azure.identity.ManagedIdentityCredential;
import com.azure.identity.ManagedIdentityCredentialBuilder;
// Code omitted for brevity
ManagedIdentityCredential miCredential = new ManagedIdentityCredentialBuilder()
.clientId(userAssignedClientId)
.build();
AzureCliCredential cliCredential = new AzureCliCredentialBuilder()
.build();
ChainedTokenCredential credential = new ChainedTokenCredentialBuilder()
.addLast(miCredential)
.addLast(cliCredential)
.build();
L'esempio di codice precedente crea una catena di credenziali personalizzata che ne comprende due. La variante con identità gestita assegnata dall'utente di ManagedIdentityCredential
viene tentata per prima, seguita da AzureCliCredential
, se necessario. Graficamente, la catena è simile alla seguente:
Suggerimento
Per migliorare le prestazioni, ottimizzare l'ordinamento delle credenziali in ChainedTokenCredential
per l'ambiente di produzione. Le credenziali destinate all'uso nell'ambiente di sviluppo locale devono essere aggiunte per ultime.
Linee guida sull'utilizzo di DefaultAzureCredential
DefaultAzureCredential
è senza dubbio il modo più semplice per iniziare a usare la libreria client di Identità di Azure, ma con tale praticità risulta compromesso. Una volta distribuita l'app in Azure, è necessario comprendere i requisiti di autenticazione dell'app. Per questo motivo è consigliabile passare da DefaultAzureCredential
a una delle soluzioni seguenti:
- Implementazione specifica delle credenziali, ad esempio
ManagedIdentityCredential
. - Un'implementazione essenziale di
ChainedTokenCredential
ottimizzata per l'ambiente Azure in cui viene eseguita l'app.
Ecco perché:
- Problematiche di debug: quando l'autenticazione non va a buon fine, può essere difficile eseguire il debug e l'identificazione della credenziale all'origine dell'errore. È necessario abilitare la registrazione per visualizzare il passaggio da una credenziale alla successiva e lo stato di esito positivo/negativo di ognuna di esse. Per altre informazioni, vedere la sezione Eseguire il debug di una credenziale concatenata.
- Overhead delle prestazioni: il processo di prova sequenziale di più credenziali può introdurre l'overhead delle prestazioni. Ad esempio, se si esegue l'app in un computer di sviluppo locale, l'identità gestita non è disponibile. Di conseguenza,
ManagedIdentityCredential
ha sempre esito negativo nell'ambiente di sviluppo locale. - Comportamento imprevedibile:
DefaultAzureCredential
verifica la presenza di alcune variabili di ambiente. È possibile che un utente possa aggiungere o modificare queste variabili di ambiente a livello di sistema nel computer host. Tali modifiche si applicano a livello globale e quindi modificano il comportamento diDefaultAzureCredential
in fase di runtime in qualsiasi app in esecuzione in tale computer.
Eseguire il debug di credenziali concatenate
Per diagnosticare un problema imprevisto o per comprendere le operazioni di una credenziale concatenata, abilitare la registrazione nell'app.
A scopo illustrativo, si supponga che venga usata la forma senza parametri di DefaultAzureCredential
per autenticare una richiesta a un account di archiviazione BLOB. L'app viene eseguita nell'ambiente di sviluppo locale e lo sviluppatore ha eseguito l'autenticazione in Azure usando l'interfaccia della riga di comando di Azure. Quando l'app viene eseguita, nell'output vengono visualizzate le voci pertinenti seguenti:
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential EnvironmentCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential WorkloadIdentityCredential is unavailable.
[ForkJoinPool.commonPool-worker-1] WARN com.microsoft.aad.msal4j.ConfidentialClientApplication - [Correlation ID: aaaa0000-bb11-2222-33cc-444444dddddd] Execution of class com.microsoft.aad.msal4j.AcquireTokenByClientCredentialSupplier failed: java.util.concurrent.ExecutionException: com.azure.identity.CredentialUnavailableException: ManagedIdentityCredential authentication unavailable. Connection to IMDS endpoint cannot be established.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential ManagedIdentityCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential SharedTokenCacheCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential IntelliJCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential AzureCliCredential returns a token
Nell'output precedente è possibile notare quanto segue:
EnvironmentCredential
,WorkloadIdentityCredential
,ManagedIdentityCredential
,SharedTokenCacheCredential
eIntelliJCredential
ogni non è riuscito ad acquisire un token di accesso Di Microsoft Entra, in tale ordine.- La
AzureCliCredential.getToken
chiamata ha esito positivo, come indicato dallareturns a token
voce con suffisso . PoichéAzureCliCredential
l'operazione è riuscita, non sono state tentate credenziali oltre.