Eseguire l'autenticazione alle risorse di Azure da app .NET ospitate in locale
Articolo
Le app ospitate al di fuori di Azure (ad esempio in locale o in un data center di terze parti) devono usare un'entità servizio dell'applicazione per l'autenticazione in Azure quando accedono alle risorse di Azure. Gli oggetti entità servizio dell'applicazione vengono creati tramite il processo di registrazione delle app in Azure. Quando viene creata un'entità servizio dell'applicazione, viene generato un ID cliente e un segreto client per l'app. L'ID client, il segreto client e l'ID tenant vengono quindi archiviati in variabili di ambiente in modo da essere usati dalla libreria di identità di Azure per autenticare l'app in Azure in fase di esecuzione.
È necessario creare una registrazione dell'app diversa per ogni ambiente in cui l'app è ospitata. In questo modo è possibile configurare le autorizzazioni per le risorse specifiche dell'ambiente per ogni entità servizio e di assicurarsi che un'app distribuita in un ambiente non parli con le risorse di Azure che fanno parte di un altro ambiente.
1 - Registrare l'applicazione in Azure
Un'app può essere registrata con Azure usando il portale di Azure o l'interfaccia della riga di comando di Azure.
Immettere registrazioni app nella barra di ricerca nella parte superiore del portale di Azure.
Selezionare l'elemento etichettato Registrazioni app sotto l'intestazione Servizi nel menu visualizzato sotto la barra di ricerca.
Nella pagina registrazioni app, selezionare + Nuova registrazione.
Nella pagina Registrare un'applicazione, compilare il modulo come segue:
Nome → Immettere un nome per la registrazione app in Azure. È consigliabile che questo nome includa il nome dell'app e l'ambiente (test, prod) per il quale è stata eseguita la registrazione dell'app.
Tipi di account supportati → Account solo in questa directory organizzativa.
Selezionare Registra per registrare l'app e creare l'entità servizio dell'applicazione.
Nella pagina Registrazione app per l'app:
ID applicazione (client) → Questo è l'ID app che l'app userà per accedere ad Azure durante lo sviluppo locale. Copiare questo valore in una posizione temporanea in un editor di testo perché sarà necessario in un passaggio futuro.
ID directory (tenant) → Questo valore sarà necessario anche per l'app quando esegue l'autenticazione in Azure. Copiare questo valore in una posizione temporanea in un editor di testo, in quanto sarà necessario in un passaggio futuro.
Credenziali client → È necessario impostare le credenziali client per l'app prima che l'app possa eseguire l'autenticazione in Azure e usare i servizi di Azure. Selezionare Aggiungi un certificato o un segreto per aggiungere le credenziali per l'app.
Nella pagina Certificati e segreti selezionare + Nuovo segreto client.
La finestra di dialogo Aggiungi un segreto client verrà visualizzata dal lato destro della pagina. In questa finestra di dialogo:
Descrizione → Immettere un valore Corrente.
Scade → Selezionare un valore di 24 mesi.
Selezionare Aggiungere per aggiungere il segreto.
IMPORTANTE: impostare un promemoria nel calendario prima della data di scadenza del segreto. In questo modo, è possibile aggiungere un nuovo segreto prima e aggiornare le app prima della scadenza di questo segreto, evitando un'interruzione del servizio nell'app.
Nella pagina Certificati e segreti verrà visualizzato il valore del segreto client.
Copiare questo valore in una posizione temporanea in un editor di testo perché sarà necessario in un passaggio futuro.
IMPORTANTE: questo è l'unico caso in cui si visualizzerà questo valore. Una volta lasciata o aggiornata la pagina, non sarà più possibile visualizzare questo valore. È possibile aggiungere un segreto client aggiuntivo senza invalidare questo segreto client, ma questo valore non verrà visualizzato di nuovo.
Interfaccia della riga di comando di Azure
az ad sp create-for-rbac --name<app-name>
L'output del comando sarà simile al seguente. Prendere nota di questi valori o mantenere aperta questa finestra, perché serviranno nella fase successiva e non sarà più possibile visualizzare il valore della password (segreto client).
2 - Assegnare ruoli all'entità servizio dell'applicazione
Successivamente, è necessario determinare i ruoli (autorizzazioni) necessari per l'app in base alle risorse e assegnare tali ruoli all'app. I ruoli possono essere assegnati a una risorsa, a gruppo di risorse o a una sottoscrizione. Questo esempio illustra come assegnare ruoli per l'entità servizio nell'ambito del gruppo di risorse, perché la maggior parte delle app raggruppa tutte le risorse di Azure in un singolo gruppo di risorse.
Individuare il gruppo di risorse per l'app cercando il nome del gruppo di risorse usando la casella di ricerca nella parte superiore del portale di Azure.
Passare al gruppo di risorse selezionando il nome del gruppo di risorse nell'intestazione Gruppi di risorse della finestra di dialogo.
Nella pagina del gruppo di risorse selezionare Controllo di accesso (IAM) nel menu a sinistra.
Nella pagina Controllo di accesso (IAM):
Selezionare la scheda Assegnazioni di ruolo.
Selezionare + Aggiungi nel menu in alto e quindi Aggiungi assegnazione di ruolo nel menu a discesa risultante.
Nella pagina Aggiungi assegnazione di ruolo sono elencati tutti i ruoli che è possibile assegnare per il gruppo di risorse.
Usare la casella di ricerca per filtrare l'elenco in modo da renderlo più gestibile. Questo esempio illustra come filtrare i ruoli di BLOB del servizio di archiviazione.
Selezionare il ruolo che si vuole assegnare.
Selezionare Avanti per passare alla schermata successiva.
La pagina Aggiungi assegnazione di ruolo successiva consente di specificare a quale utente assegnare il ruolo.
Selezionare Utente, gruppo o servizio principale in Assegnazione dell'accesso a .
Selezionare + Selezionare membri in Membri.
Verrà aperta una finestra di dialogo sul lato destro del portale di Azure.
Nella finestra di dialogo Seleziona membri:
La casella di testo Seleziona può essere usata per filtrare l'elenco di utenti e gruppi nella sottoscrizione. Se necessario, digitare i primi caratteri dell'entità servizio creata per l'app per filtrare l'elenco.
Selezionare l'entità servizio associata all'applicazione.
Selezionare Seleziona nella parte inferiore della finestra di dialogo per continuare.
L'entità servizio verrà ora visualizzata come selezionata nella schermata Aggiungi assegnazione di ruolo.
Selezionare Rivedi e assegna per passare alla pagina finale e quindi Rivedi e assegna di nuovo per completare il processo.
az role assignment create --assignee"{appId}" \
--role"{roleName}" \
--resource-group"{resourceGroupName}"
Per ottenere i nomi di ruolo a cui è possibile assegnare un'entità servizio, usare il comando az role definition list:
Interfaccia della riga di comando di Azure
az role definition list \
--query"sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Ad esempio, per consentire all'entità servizio con il appId di 00000000-0000-0000-0000-000000000000 l'accesso in lettura, scrittura ed eliminazione ai contenitori BLOB e ai dati di Archiviazione di Azure in tutti gli account di archiviazione del gruppo di risorse msdocs-dotnet-sdk-auth-example, assegnare l'entità servizio dell'applicazione al ruolo Collaboratore ai dati dei BLOB di archiviazione usando il comando seguente:
Interfaccia della riga di comando di Azure
az role assignment create --assignee"00000000-0000-0000-0000-000000000000" \
--role"Storage Blob Data Contributor" \
--resource-group"msdocs-dotnet-sdk-auth-example"
3 - Configurare le variabili di ambiente per l'applicazione
L'oggetto DefaultAzureCredential cercherà le credenziali dell'entità servizio in un set di variabili di ambiente in fase di esecuzione. 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.
È possibile impostare le variabili di ambiente per Windows dalla riga di comando. Tuttavia, quando si usa questo approccio, i valori sono accessibili a tutte le app in esecuzione in tale sistema operativo e possono causare conflitti se non si è attenti. Le variabili di ambiente possono essere impostate a livello dell’utente o del sistema.
Bash
# Set user environment variables
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000"
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111"
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz"# Set system environment variables - requires running as admin
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000" /m
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111" /m
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz" /m
È anche possibile usare PowerShell per impostare le variabili di ambiente a livello di utente o computer:
PowerShell
# Set user environment variables
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "User")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "User")
# Set system environment variables - requires running as admin
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "Machine")
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.
Fare clic con il pulsante destro del mouse sul progetto nella finestra di Esplora soluzioni di Visual Studio e selezionare Gestisci pacchetti NuGet. Cercare Azure.Identity e installare il pacchetto corrispondente. Ripetere questo processo per il pacchetto 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 e Microsoft.Extensions.Azure tramite direttive using.
Registrare il client del servizio di Azure usando il metodo di estensione con prefisso Add corrispondente.
Passare un'istanza di DefaultAzureCredential al metodo UseCredential.
Ad esempio:
c#
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:
c#
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.
Collabora con noi su GitHub
L'origine di questo contenuto è disponibile in GitHub, in cui è anche possibile creare ed esaminare i problemi e le richieste pull. Per ulteriori informazioni, vedere la guida per i collaboratori.
Feedback su .NET
.NET è un progetto di open source. Selezionare un collegamento per fornire feedback:
Informazioni su come creare, gestire e concedere le autorizzazioni alle entità servizio, che consentono alle pipeline di distribuzione di autenticarsi in modo sicuro in Azure.
Illustrare le funzionalità di Microsoft Entra ID per modernizzare le soluzioni di identità, implementare soluzioni ibride e implementare la governance delle identità.