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.

Altre informazioni sulle procedure consigliate e su quando usare le identità assegnate dal sistema rispetto alle identità assegnate dall'utente nelle raccomandazioni sulle procedure consigliate per le identità.

Esplorare DefaultAzureCredential

Le identità gestite vengono in genere implementate nel codice dell'applicazione tramite una classe chiamata DefaultAzureCredential dalla Azure.Identity libreria client. DefaultAzureCredential supporta più metodi di autenticazione e determina automaticamente quali devono essere usati in fase di esecuzione. Per altre informazioni su questo approccio, vedere la panoramica di DefaultAzureCredential.

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

È stato eseguito il compito di 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 Azure Spring Apps, 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.

Diagram showing the user assigned identity relationships.

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 Stato su Sì per abilitare un'identità gestita assegnata dal sistema per il servizio.

    Screenshot showing how to assign a system assigned managed identity.

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 showing how to assign a system-assigned identity.

  4. Nella casella di ricerca Ruolo cercare Archiviazione Collaboratore dati BLOB, 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 l'Archiviazione Collaboratore dati BLOB nell'elenco e scegliere Avanti.

  5. Nella schermata Aggiungi assegnazione di ruolo selezionare Identità gestita per l'opzione Assegna accesso a. 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 showing how to select a system-assigned identity.

  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 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

All'interno del progetto aggiungere un riferimento al Azure.Identity pacchetto NuGet. Questa libreria contiene tutte le entità necessarie per implementare DefaultAzureCredential. È anche possibile aggiungere qualsiasi altra libreria di Azure pertinente per l'app. Per questo esempio, i Azure.Storage.Blobs pacchetti e Azure.KeyVault.Keys vengono aggiunti per connettersi all'Archiviazione BLOB e all'insieme di credenziali delle chiavi.

dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.KeyVault.Keys

Nella parte superiore del Program.cs file aggiungere le istruzioni using seguenti:

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Security.KeyVault.Keys;

Program.cs Nel file del codice del progetto creare istanze dei servizi necessari a cui si connetterà l'app. Gli esempi seguenti si connettono al Archiviazione BLOB e al bus di servizio usando le classi SDK corrispondenti.

var blobServiceClient = new BlobServiceClient(
    new Uri("https://<your-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential(credOptions));

var serviceBusClient = new ServiceBusClient("<your-namespace>", new DefaultAzureCredential());
var sender = serviceBusClient.CreateSender("producttracking");

Quando il codice dell'applicazione viene eseguito in locale, DefaultAzureCredential eseguirà una ricerca in una catena di credenziali per le prime credenziali disponibili. Se è Managed_Identity_Client_ID Null in locale, userà automaticamente le credenziali dell'interfaccia della riga di comando di Azure locale o dell'accesso a Visual Studio. Altre informazioni su questo processo sono disponibili nella panoramica della libreria di identità di Azure.

Quando l'applicazione viene distribuita in Azure, DefaultAzureCredential recupera automaticamente la Managed_Identity_Client_ID variabile dall'ambiente del 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.

Connessione più app che usano più identità gestite

Anche se le app nell'esempio precedente hanno condiviso tutti 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.

Diagram showing multiple user-assigned managed identities.

Per configurare questa configurazione nel codice, assicurarsi che l'applicazione registri servizi separati per connettersi a ogni account di archiviazione o database. Assicurarsi di eseguire il pull degli ID client dell'identità gestita corretti per ogni servizio durante la configurazione di DefaultAzureCredential. Nell'esempio di codice seguente vengono configurate le connessioni al servizio seguenti:

  • 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 condiviso
// Get the first user-assigned managed identity ID to connect to shared storage
const clientIdStorage = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage");

// First blob storage client that using a managed identity
BlobServiceClient blobServiceClient = new BlobServiceClient(
    new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });

// Second blob storage client that using a managed identity
BlobServiceClient blobServiceClient2 = new BlobServiceClient(
    new Uri("https://<contract-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });


// Get the second user-assigned managed identity ID to connect to shared databases
var clientIDdatabases = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases");

// Create an Azure Cosmos DB client
CosmosClient client = new CosmosClient(
    accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDdatabases
    });

// Open a connection to Azure SQL using a managed identity
string ConnectionString1 = @"Server=<azure-sql-hostname>.database.windows.net; User Id=ClientIDOfTheManagedIdentity; Authentication=Active Directory Default; Database=<database-name>";

using (SqlConnection conn = new SqlConnection(ConnectionString1))
{
    conn.Open();
}

È anche possibile associare un'identità gestita assegnata dall'utente e un'identità gestita assegnata dal sistema a una risorsa contemporaneamente. 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 molto specifica da un servizio aggiuntivo. L'uso di un'identità assegnata dal sistema garantisce anche che l'identità associata a tale app specifica venga eliminata quando l'app viene eliminata, che può contribuire a mantenere pulito l'ambiente.

Diagram showing user-assigned and system-assigned managed identities.

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

Passaggi successivi

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