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 offre linee guida per ottimizzare le prestazioni e l'affidabilità delle app .NET durante l'autenticazione ai servizi di Azure. Per sfruttare al meglio la libreria di identità di Azure per .NET, è importante comprendere i potenziali problemi e le tecniche di mitigazione.
Usare credenziali deterministiche negli ambienti di produzione
DefaultAzureCredential è il modo più accessibile per iniziare a usare la libreria di identità di Azure, ma questa praticità introduce anche alcuni compromessi. In particolare, le credenziali specifiche nella catena che avranno esito positivo e che verranno usate per l'autenticazione della richiesta non possono essere garantite in anticipo. In un ambiente di produzione, questa imprevedibilità può introdurre problemi significativi e talvolta sottili.
Si consideri, ad esempio, la sequenza ipotetica di eventi seguente:
- Il team di sicurezza di un'organizzazione impone a tutte le app di usare l'identità gestita per l'autenticazione alle risorse di Azure.
- Per mesi, un'app .NET ospitata in una macchina virtuale di Azure usa correttamente
DefaultAzureCredentialper l'autenticazione tramite identità gestita. - Senza indicare al team di supporto, uno sviluppatore installa l'interfaccia della riga di comando di Azure in tale macchina virtuale ed esegue il comando
az loginper l'autenticazione in Azure. - A causa di una modifica di configurazione separata nell'ambiente Azure, l'autenticazione tramite l'identità gestita originale inizia in modo imprevisto a non riuscire in modo invisibile all'utente.
-
DefaultAzureCredentialignora ilManagedIdentityCredentialnon riuscito e cerca le credenziali disponibili successive, ovveroAzureCliCredential. - L'applicazione inizia a usare le credenziali dell'interfaccia della riga di comando di Azure anziché l'identità gestita, che potrebbe non riuscire o comportare un'elevazione o una riduzione imprevista dei privilegi.
Per evitare questi tipi di problemi sottili o errori invisibile all'utente nelle app di produzione, sostituire DefaultAzureCredential con un'implementazione di TokenCredential specifica, ad esempio ManagedIdentityCredential. Vedere l'elenco derivato per le opzioni.
Si consideri ad esempio la configurazione seguente in un progetto ASP.NET Core. Un'istanza di DefaultAzureCredential viene creata in modo implicito e usata per tutti i client del servizio registrati:
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddSecretClient(
new Uri($"https://{keyVaultName}.vault.azure.net"));
clientBuilder.AddBlobServiceClient(
new Uri($"https://{storageAccountName}.blob.core.windows.net"));
});
Modificare il codice precedente per selezionare una credenziale in base all'ambiente in cui è in esecuzione l'app:
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddSecretClient(
new Uri($"https://{keyVaultName}.vault.azure.net"));
clientBuilder.AddBlobServiceClient(
new Uri($"https://{storageAccountName}.blob.core.windows.net"));
TokenCredential credential;
if (builder.Environment.IsProduction() || builder.Environment.IsStaging())
{
string? clientId = builder.Configuration["UserAssignedClientId"];
credential = new ManagedIdentityCredential(
ManagedIdentityId.FromUserAssignedClientId(clientId));
}
else
{
// local development environment
credential = new ChainedTokenCredential(
new VisualStudioCredential(),
new AzureCliCredential(),
new AzurePowerShellCredential());
}
clientBuilder.UseCredential(credential);
});
In questo esempio viene usato solo ManagedIdentityCredential nell'ambiente di produzione. Le esigenze di autenticazione dell'ambiente di sviluppo locale vengono quindi gestite dalla sequenza di credenziali definite nella clausola else.
Riutilizzare le istanze delle credenziali
Riutilizzare le istanze delle credenziali quando possibile per migliorare la resilienza delle app e ridurre il numero di richieste di token di accesso inviate a Microsoft Entra ID. Quando viene riutilizzata una credenziale, viene effettuato un tentativo di recuperare un token dalla cache dei token dell'app gestita dalla dipendenza MSAL sottostante. Per altre informazioni, vedere Memorizzazione nella cache dei token nella libreria client di Azure Identity.
Importante
Un'app con volumi elevati che non riutilizza le credenziali potrebbe riscontrare risposte di limitazione delle risorse HTTP 429 da Microsoft Entra ID, e ciò può portare a interruzioni dell'app.
La strategia di riutilizzo delle credenziali consigliata è diversa dal tipo di applicazione .NET.
Per implementare il riutilizzo delle credenziali, usare il metodo UseCredential da Microsoft.Extensions.Azure. Si consideri un'app core ASP.NET ospitata nel servizio app di Azure sia in ambienti di produzione che di gestione temporanea. La variabile di ambiente ASPNETCORE_ENVIRONMENT è impostata su Production o Staging per distinguere tra questi due ambienti non di sviluppo. Sia nell'ambiente di produzione che nell'ambiente di staging, la variante assegnata dall'utente di ManagedIdentityCredential viene utilizzata per autenticare i segreti di Key Vault e i client di Blob Storage.
Quando l'app viene eseguita in un computer di sviluppo locale, in cui ASPNETCORE_ENVIRONMENT è impostata su Development, viene invece usata una sequenza concatenata di credenziali dello strumento di sviluppo. Questo approccio garantisce l'uso delle credenziali appropriate per l'ambiente, il miglioramento della sicurezza e la semplificazione della gestione delle credenziali.
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddSecretClient(
new Uri($"https://{keyVaultName}.vault.azure.net"));
clientBuilder.AddBlobServiceClient(
new Uri($"https://{storageAccountName}.blob.core.windows.net"));
TokenCredential credential;
if (builder.Environment.IsProduction() || builder.Environment.IsStaging())
{
string? clientId = builder.Configuration["UserAssignedClientId"];
credential = new ManagedIdentityCredential(
ManagedIdentityId.FromUserAssignedClientId(clientId));
}
else
{
// local development environment
credential = new ChainedTokenCredential(
new VisualStudioCredential(),
new AzureCliCredential(),
new AzurePowerShellCredential());
}
clientBuilder.UseCredential(credential);
});
Per informazioni su questo approccio in un'app ASP.NET Core, vedere Autenticazione con Microsoft Entra ID.
Comprendere quando è necessaria la logica di memorizzazione nella cache e la durata dei token
Se si usano credenziali della libreria di identità di Azure al di fuori del contesto di una libreria client dell'SDK di Azure che dipende da Azure Core, diventa responsabilità dell'utente la gestione della durata di vita dei token e il comportamento di memorizzazione nella cache nell'app.
La proprietà RefreshOn in AccessToken, che fornisce un suggerimento ai consumer quando è possibile tentare l'aggiornamento del token, verrà usata automaticamente dalle librerie client di Azure SDK che dipendono dalla libreria Core di Azure per aggiornare il token. Per utilizzare direttamente le credenziali della libreria di identità di Azure , che supportano la memorizzazione nella cache dei token, la cache MSAL sottostante si aggiorna automaticamente in modo proattivo quando si verifica l'evento di RefreshOn. Questa progettazione consente al codice client di chiamare GetToken ogni volta che è necessario un token e delegare l'aggiornamento alla libreria.
Per chiamare GetToken solo quando necessario, osservare la data di RefreshOn e tentare in modo proattivo di aggiornare il token dopo tale ora. L'implementazione specifica spetta al cliente.
Comprendere la strategia di ripetizione dei tentativi per identità gestita
La libreria di identità di Azure per .NET consente di eseguire l'autenticazione tramite identità gestita con ManagedIdentityCredential. La modalità in cui si usa ManagedIdentityCredential influisce sulla strategia di ripetizione dei tentativi applicata.
Modalità "Fail fast"
- Quando usare: Per gli scenari di sviluppo locali in cui si vuole inviare commenti e suggerimenti rapidi
-
Come attivare: Usare
DefaultAzureCredentialin uno dei modi seguenti:- Senza impostare la variabile di ambiente
AZURE_TOKEN_CREDENTIALS - Con la variabile di ambiente
AZURE_TOKEN_CREDENTIALSimpostata su una stringa diversa daManagedIdentityCredential
- Senza impostare la variabile di ambiente
- Come funziona: Non vengono tentati tentativi quando il tentativo di acquisizione del token iniziale ha esito negativo o si verifica il timeout dopo un breve periodo di tempo. Si tratta della modalità meno resiliente perché è ottimizzata per "fail fast" per un ciclo interno di sviluppo efficiente.
Modalità resiliente
Quando usare: Per gli scenari di produzione in cui la resilienza è importante
Come attivare: Adottare uno degli approcci seguenti:
Usare
DefaultAzureCredentialcon la variabile di ambienteAZURE_TOKEN_CREDENTIALSimpostata suManagedIdentityCredentialImportante
Questo
DefaultAzureCredentialapproccio funziona solo in modalità resiliente quando si usaAzure.Identityla versione 1.16.0 o successiva del pacchetto. Nelle versioni precedenti, questo approccio funziona in modalità "fail fast".Usa
ChainedTokenCredentialcontenenteManagedIdentityCredentialUsare
ManagedIdentityCredentialdirettamente
Come funziona: L'intervallo di tempo tra i tentativi inizia a 0,8 secondi e un massimo di cinque tentativi viene eseguito con backoff esponenziale, per impostazione predefinita. Questa modalità è ottimizzata per la resilienza, ma introduce ritardi potenzialmente indesiderati nel ciclo interno di sviluppo.
Per modificare le impostazioni predefinite dei tentativi, usare la Retry proprietà in
DefaultAzureCredentialOptionsoManagedIdentityCredentialOptions. Ad esempio, ripetere un massimo di tre volte, con un intervallo di inizio di 0,5 secondi:ManagedIdentityCredentialOptions miCredentialOptions = new( ManagedIdentityId.FromUserAssignedClientId(clientId) ) { Retry = { MaxRetries = 3, Delay = TimeSpan.FromSeconds(0.5), } }; ManagedIdentityCredential miCredential = new(miCredentialOptions);Per altre informazioni sulla personalizzazione dei criteri di ripetizione dei tentativi, vedere Impostazione di un criterio di ripetizione dei tentativi personalizzato.