Procedure consigliate per l'autenticazione con la libreria di identità di Azure per .NET
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
DefaultAzureCredential
per 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 login
per 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.
-
DefaultAzureCredential
ignora ilManagedIdentityCredential
non 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 di DefaultAzureCredential
seguente in un progetto ASP.NET Core:
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddSecretClient(
new Uri($"https://{keyVaultName}.vault.azure.net"));
clientBuilder.AddBlobServiceClient(
new Uri($"https://{storageAccountName}.blob.core.windows.net"));
DefaultAzureCredential credential = new();
clientBuilder.UseCredential(credential);
});
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
. Il modo in cui si usa ManagedIdentityCredential
influisce sulla strategia di ripetizione dei tentativi applicata. Se usato tramite:
-
DefaultAzureCredential
, 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. Questa è l'opzione meno resiliente perché è ottimizzata per un approccio di "fallimento rapido" per un ciclo interno di sviluppo efficiente. - Qualsiasi altro approccio, ad esempio
ChainedTokenCredential
oManagedIdentityCredential
direttamente:L'intervallo di tempo tra i tentativi inizia a 0,8 secondi e viene effettuato un tentativo massimo di cinque tentativi per impostazione predefinita. Questa opzione è ottimizzata per la resilienza, ma introduce ritardi potenzialmente indesiderati nel ciclo interno di sviluppo.
Per modificare una delle impostazioni predefinite per i tentativi, usare la proprietà
Retry
inManagedIdentityCredentialOptions
. 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.