Condividi tramite


Configurare connessioni senza password tra più app e servizi di Azure

Le applicazioni richiedono spesso connessioni sicure tra più servizi di Azure contemporaneamente. Ad esempio, un'istanza del servizio app Azure aziendale potrebbe connettersi a diversi account di archiviazione, un'istanza del database SQL di Azure, un bus di servizio e altro ancora.

Le identità gestite sono l'opzione di autenticazione consigliata per connessioni sicure senza password tra le risorse di Azure. Gli sviluppatori non devono tenere traccia e gestire manualmente molti segreti diversi per le identità gestite, poiché la maggior parte di queste attività viene gestita internamente da Azure. Questa esercitazione illustra come gestire le connessioni tra più servizi usando identità gestite e la libreria client di Identità di Azure.

Confrontare i tipi di identità gestite

Azure offre i tipi di identità gestite seguenti:

  • Le identità gestite assegnate dal sistema sono direttamente collegate a una singola risorsa di Azure. Quando si abilita un'identità gestita assegnata dal sistema in un servizio, Azure creerà un'identità collegata e gestirà le attività amministrative per tale identità internamente. Quando la risorsa di Azure viene eliminata, viene eliminata anche l'identità.
  • Le identità gestite assegnate dall'utente sono identità indipendenti create da un amministratore e possono essere associate a una o più risorse di Azure. Il ciclo di vita dell'identità è indipendente da tali risorse.

Per altre informazioni sulle procedure consigliate e su quando usare le identità gestite assegnate dal sistema rispetto alle identità gestite assegnate dall'utente, vedere raccomandazioni sulle procedure consigliate per le identità gestite.

Esplorare DefaultAzureCredential

Le identità gestite vengono implementate più facilmente nel codice dell'applicazione tramite una classe chiamata DefaultAzureCredential dalla libreria client di Identità di Azure. DefaultAzureCredential supporta più meccanismi di autenticazione e determina automaticamente quali devono essere usati in fase di esecuzione. Altre informazioni sugli DefaultAzureCredential ecosistemi seguenti:

Connettere un'app ospitata in Azure a più servizi di Azure

Si supponga di dover connettere un'app esistente a più servizi e database di Azure usando connessioni senza password. L'applicazione è un'API Web di ASP.NET Core ospitata nel servizio app Azure, anche se i passaggi seguenti si applicano anche ad altri ambienti di hosting di Azure, ad esempio App Spring di Azure, Macchine virtuali, App contenitore e servizio Azure Kubernetes.

Questa esercitazione si applica alle architetture seguenti, anche se può essere adattata a molti altri scenari e tramite modifiche minime alla configurazione.

Diagramma che mostra le relazioni di identità assegnate dall'utente.

La procedura seguente illustra come configurare un'app per l'uso di un'identità gestita assegnata dal sistema e dell'account di sviluppo locale per connettersi a più servizi di Azure.

Creare un'identità gestita assegnata dal sistema

  1. Nella portale di Azure passare all'applicazione ospitata che si vuole connettere ad altri servizi.

  2. Nella pagina di panoramica del servizio selezionare Identità.

  3. Impostare Statosu Sì per abilitare un'identità gestita assegnata dal sistema per il servizio.

    Screenshot che mostra come assegnare un'identità gestita assegnata dal sistema.

Assegnare ruoli all'identità gestita per ogni servizio connesso

  1. Passare alla pagina di panoramica dell'account di archiviazione a cui si vuole concedere l'accesso all'identità.

  2. Selezionare Controllo di accesso (IAM) nel riquadro di spostamento dell'account di archiviazione.

  3. Scegliere + Aggiungi e quindi Aggiungi assegnazione di ruolo.

    Screenshot che mostra come individuare la sezione portale di Azure per l'assegnazione di un ruolo a un'identità gestita assegnata dal sistema.

  4. Nella casella di ricerca Ruolo cercare Collaboratore dati BLOB di archiviazione, che concede le autorizzazioni per eseguire operazioni di lettura e scrittura sui dati BLOB. È possibile assegnare qualsiasi ruolo appropriato per il caso d'uso. Selezionare Collaboratore dati BLOB di archiviazione nell'elenco e scegliere Avanti.

  5. Nella schermata Aggiungi assegnazione di ruolo , per l’opzione Assegna accesso a, selezionare Identità gestita. Scegliere quindi +Seleziona membri.

  6. Nel riquadro a comparsa cercare l'identità gestita creata immettendo il nome del servizio app. Selezionare l'identità assegnata dal sistema e quindi scegliere Seleziona per chiudere il menu a comparsa.

    Screenshot che mostra come assegnare un ruolo a un'identità gestita assegnata dal sistema nel portale di Azure.

  7. Selezionare Avanti un paio di volte fino a quando non è possibile selezionare Rivedi e assegna per completare l'assegnazione di ruolo.

  8. Ripetere questo processo per gli altri servizi a cui ci si vuole connettere.

Considerazioni sullo sviluppo locale

È anche possibile abilitare l'accesso alle risorse di Azure per lo sviluppo locale assegnando ruoli a un account utente nello stesso modo in cui sono stati assegnati ruoli all'identità gestita.

  1. Dopo aver assegnato il ruolo Collaboratore dati BLOB di archiviazione all'identità gestita, in Assegna accesso a questa volta selezionare Utente, gruppo o entità servizio. Scegliere + Seleziona membri per aprire di nuovo il menu a comparsa.

  2. Cercare l'account user@domain o il gruppo di sicurezza Microsoft Entra a cui si vuole concedere l'accesso tramite indirizzo di posta elettronica o nome e quindi selezionarlo. Questo deve essere lo stesso account usato per accedere agli strumenti di sviluppo locali, ad esempio Visual Studio o l'interfaccia della riga di comando di Azure.

Nota

È anche possibile assegnare questi ruoli a un gruppo di sicurezza Di Microsoft Entra se si lavora a un team con più sviluppatori. È quindi possibile inserire qualsiasi sviluppatore all'interno di tale gruppo che deve accedere per sviluppare l'app in locale.

Implementare il codice dell'applicazione

  1. Nel progetto installare il Azure.Identity pacchetto. Questa libreria fornisce DefaultAzureCredential. È anche possibile aggiungere qualsiasi altra libreria di Azure pertinente per l'app. Per questo esempio, i pacchetti e Azure.Messaging.ServiceBus vengono aggiunti rispettivamente per connettersi all'archiviazione Azure.Storage.Blobs BLOB e bus di servizio.

    dotnet add package Azure.Identity
    dotnet add package Azure.Messaging.ServiceBus
    dotnet add package Azure.Storage.Blobs
    
  2. Creare un'istanza dei client del servizio per i servizi di Azure a cui l'app deve connettersi. L'esempio di codice seguente interagisce con l'archiviazione BLOB e bus di servizio usando i client del servizio corrispondenti.

    using Azure.Identity;
    using Azure.Messaging.ServiceBus;
    using Azure.Storage.Blobs;
    
    // Create DefaultAzureCredential instance that uses system-assigned managed identity
    // in the underlying ManagedIdentityCredential.
    DefaultAzureCredential credential = new();
    
    BlobServiceClient blobServiceClient = new(
        new Uri("https://<your-storage-account>.blob.core.windows.net"),
        credential);
    
    ServiceBusClient serviceBusClient = new("<your-namespace>", credential);
    ServiceBusSender sender = serviceBusClient.CreateSender("producttracking");
    

Quando questo codice viene eseguito in locale, DefaultAzureCredential cerca le prime credenziali disponibili nella catena di credenziali. Se la Managed_Identity_Client_ID variabile di ambiente è Null in locale, viene usata una credenziale corrispondente a uno strumento di sviluppo installato localmente. Ad esempio, interfaccia della riga di comando di Azure o Visual Studio. Per altre informazioni su questo processo, vedere la sezione Esplorare DefaultAzureCredential.

Quando l'applicazione viene distribuita in Azure, DefaultAzureCredential recupera automaticamente la Managed_Identity_Client_ID variabile dall'ambiente servizio app. Tale valore diventa disponibile quando un'identità gestita è associata all'app.

Questo processo complessivo garantisce che l'app possa essere eseguita in modo sicuro in locale e in Azure senza la necessità di apportare modifiche al codice.

Connettere più app usando più identità gestite

Anche se le app nell'esempio precedente hanno condiviso gli stessi requisiti di accesso ai servizi, gli ambienti reali sono spesso più sfumati. Si consideri uno scenario in cui più app si connettono agli stessi account di archiviazione, ma due delle app accedono anche a servizi o database diversi.

Diagramma che mostra più identità gestite assegnate dall'utente.

Per configurare questa configurazione nel codice, assicurarsi che l'applicazione registri client di servizio separati per connettersi a ogni account di archiviazione o database. Fare riferimento agli ID client dell'identità gestita corretti per ogni servizio durante la configurazione di DefaultAzureCredential. Gli esempi di codice seguenti configurano queste connessioni al servizio di Azure:

  • Due connessioni a account di archiviazione separati tramite un'identità gestita assegnata dall'utente condiviso
  • Una connessione ad Azure Cosmos DB e ai servizi SQL di Azure usando una seconda identità gestita assegnata dall'utente. Questa identità gestita viene condivisa quando il driver client SQL di Azure lo consente. Per altre informazioni, vedere i commenti del codice.
  1. Nel progetto installare i pacchetti necessari. La libreria di identità di Azure fornisce DefaultAzureCredential.

    dotnet add package Azure.Identity
    dotnet add package Azure.Storage.Blobs
    dotnet add package Microsoft.Azure.Cosmos
    dotnet add package Microsoft.Data.SqlClient
    
  2. Aggiungere quanto segue al codice:

    using Azure.Core;
    using Azure.Identity;
    using Azure.Storage.Blobs;
    using Microsoft.Azure.Cosmos;
    using Microsoft.Data.SqlClient;
    
    string clientIdStorage =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialStorage = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdStorage,
        });
    
    // First Blob Storage client
    BlobServiceClient blobServiceClient1 = new(
        new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    // Second Blob Storage client
    BlobServiceClient blobServiceClient2 = new(
        new Uri("https://<contract-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    string clientIdDatabases =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialDatabases = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdDatabases,
        });
    
    // Create an Azure Cosmos DB client
    CosmosClient cosmosClient = new(
        Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
        credentialDatabases);
    
    // Open a connection to Azure SQL
    string connectionString =
        $"Server=<azure-sql-hostname>.database.windows.net;User Id={clientIdDatabases};Authentication=Active Directory Default;Database=<database-name>";
    
    using (SqlConnection connection = new(connectionString)
    {
        AccessTokenCallback = async (authParams, cancellationToken) =>
        {
            const string defaultScopeSuffix = "/.default";
            string scope = authParams.Resource.EndsWith(defaultScopeSuffix)
                ? authParams.Resource
                : $"{authParams.Resource}{defaultScopeSuffix}";
            AccessToken token = await credentialDatabases.GetTokenAsync(
                new TokenRequestContext([scope]),
                cancellationToken);
    
            return new SqlAuthenticationToken(token.Token, token.ExpiresOn);
        }
    })
    {
        connection.Open();
    }
    

È anche possibile associare contemporaneamente un'identità gestita assegnata dall'utente e un'identità gestita assegnata dal sistema a una risorsa. Ciò può essere utile negli scenari in cui tutte le app richiedono l'accesso agli stessi servizi condivisi, ma una delle app ha anche una dipendenza specifica da un servizio aggiuntivo. L'uso di un'identità gestita assegnata dal sistema garantisce anche che l'identità associata a tale app specifica venga eliminata quando l'app viene eliminata, che consente di mantenere pulito l'ambiente.

Diagramma che mostra le identità gestite assegnate dall'utente e assegnate dal sistema.

Questi tipi di scenari vengono esaminati in modo più approfondito nelle raccomandazioni sulle procedure consigliate sulle identità gestite.

Passaggi successivi

In questa esercitazione si è appreso come eseguire la migrazione di un'applicazione a connessioni senza password. Leggere le risorse seguenti per esplorare i concetti illustrati in questo articolo in modo più approfondito: