Autenticare le app .NET nei servizi di Azure durante lo sviluppo locale usando le entità servizio
Gli sviluppatori devono eseguire il debug e testare le app cloud nella workstation locale. Quando un'app viene eseguita nella workstation di uno sviluppatore durante lo sviluppo locale, deve comunque eseguire l'autenticazione a tutti i servizi di Azure usati dall'app. Questo articolo illustra come configurare oggetti entità servizio dell'applicazione dedicati da usare durante lo sviluppo locale.
Le entità servizio dell'applicazione dedicate per lo sviluppo locale consentono di seguire il principio dei privilegi minimi durante lo sviluppo di app. Poiché l'ambito delle autorizzazioni è esattamente quello necessario per l'app durante lo sviluppo, il codice dell'app non può accedere accidentalmente a una risorsa di Azure destinata all'uso da parte di un'app diversa. Ciò impedisce anche che si verifichino bug quando l'app viene spostata nell'ambiente di produzione perché l'app è stata privilegiata nell'ambiente di sviluppo.
Un'entità servizio dell'applicazione viene configurata per l'app quando l'app viene registrata in Azure. Quando si registra un’app per lo sviluppo locale, è consigliabile:
- Creare una registrazione app separate per ogni sviluppatore che lavora sull'app. In questo modo verranno create entità servizio dell'applicazione separate per ogni sviluppatore da usare durante lo sviluppo locale ed evitare la necessità per gli sviluppatori di condividere le credenziali per una singola entità servizio dell'applicazione.
- Creare una registrazione dell’app separata per ogni app. Questo definisce l'ambito delle autorizzazioni dell'app solo a ciò che è necessario per l'app.
Durante lo sviluppo locale, le variabili di ambiente vengono impostate con l'identità dell'entità servizio dell'applicazione. La libreria di identità di Azure legge queste variabili di ambiente e usa queste informazioni per autenticare l'app nelle risorse di Azure necessarie.
1 - Registrare l'applicazione in Azure
Gli oggetti entità servizio dell'applicazione vengono creati con una registrazione dell'app in Azure. Questa operazione può essere effettuata tramite il portale di Azure o l'interfaccia della riga di comando di Azure.
Accedere al portale di Azure e seguire la procedura seguente.
2 - Creare un gruppo Microsoft Entra per lo sviluppo locale
Poiché in genere sono presenti più sviluppatori che lavorano in un'app, è consigliabile creare un gruppo di Microsoft Entra per incapsulare i ruoli (autorizzazioni) necessari per l'app nello sviluppo locale anziché assegnare i ruoli ai singoli oggetti entità servizio. Questo approccio offre i vantaggi seguenti:
- Ogni sviluppatore ha la certezza di avere gli stessi ruoli assegnati perché i ruoli vengono assegnati a livello di gruppo.
- Se è necessario un nuovo ruolo per l'app, deve essere aggiunto solo al gruppo per l'app.
- Se un nuovo sviluppatore si aggiunge al team, viene creata una nuova entità servizio dell'applicazione per lo sviluppatore e aggiunta al gruppo, assicurando che lo sviluppatore disponga delle autorizzazioni appropriate per lavorare sull'app.
3 - Assegnare ruoli all'applicazione
Successivamente, determinare i ruoli (autorizzazioni) necessari per l'app in base alle risorse e assegnare tali ruoli all'app. In questo esempio i ruoli verranno assegnati al gruppo di Microsoft Entra creato nel passaggio 2. Ai gruppi possono essere assegnati a una risorsa, a un gruppo di risorse o a una sottoscrizione. Questo esempio illustra come assegnare i ruoli a livello di gruppo di risorse perché la maggior parte delle app raggruppa tutte le risorse di Azure in un unico gruppo di risorse.
4 - Impostare le variabili di ambiente dell'applicazione
In fase di esecuzione, DefaultAzureCredential
cerca le informazioni sull'entità servizio in una raccolta di variabili di ambiente. Esistono diversi modi per configurare le variabili di ambiente quando si usa .NET a seconda degli strumenti e dell'ambiente.
Indipendentemente dall'approccio scelto, configurare le variabili di ambiente seguenti quando si usa un'entità servizio:
AZURE_CLIENT_ID
→ Il valore dell'ID dell'app.AZURE_TENANT_ID
→ Il valore dell'ID del tenant.AZURE_CLIENT_SECRET
→ Password/credenziali generate per l'app.
Quando si lavora localmente con Visual Studio, le variabili di ambiente possono essere impostate nel file launchsettings.json
nella cartella del progetto Properties
. All'avvio dell'app, questi valori vengono estratti automaticamente. Tenere presente che queste configurazioni non viaggiano con l'app quando viene distribuita, quindi è necessario configurare le variabili di ambiente nell'ambiente di hosting di destinazione.
"profiles": {
"SampleProject": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7177;http://localhost:5177",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
"AZURE_TENANT_ID":"11111111-1111-1111-1111-111111111111",
"AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
"AZURE_TENANT_ID": "11111111-1111-1111-1111-111111111111",
"AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
}
}
}
5 - Implementare DefaultAzureCredential nell'applicazione
DefaultAzureCredential è una sequenza ordinata di meccanismi per l'autenticazione a Microsoft Entra. Ogni meccanismo di autenticazione è una classe derivata dalla classe TokenCredential ed è nota come credenziale. In fase di esecuzione, DefaultAzureCredential
tenta di eseguire l'autenticazione usando la prima credenziale. 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. In questo modo, l'app può usare credenziali diverse in ambienti diversi senza scrivere codice specifico dell'ambiente.
L'ordine e le posizioni in cui DefaultAzureCredential
cerca le credenziali sono disponibili in DefaultAzureCredential.
Per usare DefaultAzureCredential
, aggiungere Azure.Identity e facoltativamente, i pacchetti Microsoft.Extensions.Azure all'applicazione:
In un terminale di propria scelta passare alla directory del progetto dell'applicazione ed eseguire i comandi seguenti:
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
È possibile accedere ai servizi di Azure usando classi client specializzate dalle varie librerie client di Azure SDK. Queste classi e i propri servizi personalizzati devono essere registrati in modo da poter essere accessibili tramite l'inserimento delle dipendenze in tutta l'app. In Program.cs
completare i passaggi seguenti per registrare una classe client e DefaultAzureCredential
:
- Includere gli spazi dei nomi
Azure.Identity
eMicrosoft.Extensions.Azure
tramite direttiveusing
. - Registrare il client del servizio di Azure usando il metodo di estensione con prefisso
Add
corrispondente. - Passare un'istanza di
DefaultAzureCredential
al metodoUseCredential
.
Ad esempio:
using Microsoft.Extensions.Azure;
using Azure.Identity;
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new DefaultAzureCredential());
});
Un'alternativa a UseCredential
consiste nel creare un'istanza diretta di DefaultAzureCredential
:
using Azure.Identity;
builder.Services.AddSingleton<BlobServiceClient>(_ =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new DefaultAzureCredential()));
Quando il codice precedente viene eseguito nella workstation di sviluppo locale, cerca nelle variabili di ambiente un'entità servizio dell'applicazione o negli strumenti di sviluppo installati localmente, come Visual Studio, per un set di credenziali per sviluppatori. Entrambi gli approcci possono essere usati per autenticare l'app nelle risorse di Azure durante lo sviluppo locale.
Quando distribuito in Azure, lo stesso codice può anche autenticare l'app in altre risorse di Azure. DefaultAzureCredential
può recuperare automaticamente le impostazioni dell'ambiente e le configurazioni dell'identità gestita per l'autenticazione automatica in altri servizi.