Connessione dall'applicazione alle risorse senza gestire le credenziali

Le risorse di Azure con supporto delle identità gestite offrono sempre un'opzione per specificare un'identità gestita per connettersi alle risorse di Azure che supportano l'autenticazione di Microsoft Entra. Il supporto delle identità gestite rende superfluo agli sviluppatori la gestione delle credenziali nel codice. Le identità gestite sono l'opzione di autenticazione consigliata quando si lavora con le risorse di Azure che le supportano. Leggere una panoramica delle identità gestite.

Questa pagina illustra come configurare un servizio app in modo che possa connettersi ad Azure Key Vault, Archiviazione di Azure e Microsoft SQL Server. Gli stessi principi possono essere usati per qualsiasi risorsa di Azure che supporta le identità gestite e che si connetterà alle risorse che supportano l'autenticazione di Microsoft Entra.

Gli esempi di codice usano la libreria client di Azure Identity, che è il metodo consigliato perché gestisce automaticamente molti dei passaggi necessari, inclusa l'acquisizione di un token di accesso usato nella connessione.

A quali risorse possono connettersi le identità gestite?

Un'identità gestita può connettersi a qualsiasi risorsa che supporti l'autenticazione di Microsoft Entra. In generale, non è necessario alcun supporto speciale per la risorsa per consentire alle identità gestite di connettersi.

Alcune risorse non supportano l'autenticazione di Microsoft Entra o la libreria client non supporta l'autenticazione con un token. Continuare a leggere per vedere le indicazioni su come usare un'identità gestita per accedere in modo sicuro alle credenziali senza dover archiviarle nel codice o nella configurazione dell'applicazione.

Creazione di un'identità gestita

Esistono due tipi di identità gestita: assegnata dal sistema e assegnata dall'utente. Le identità assegnate dal sistema sono collegate direttamente a una singola risorsa di Azure. Quando la risorsa di Azure viene eliminata, si tratta dell'identità. Un'identità gestita assegnata dall'utente può essere associata a più risorse di Azure e il relativo ciclo di vita è indipendente da tali risorse.

Questo articolo illustra come creare e configurare un'identità gestita assegnata dall'utente, consigliata per la maggior parte degli scenari. Se la risorsa di origine in uso non supporta le identità gestite assegnate dall'utente, è necessario fare riferimento alla documentazione del provider di risorse per informazioni su come configurarla per avere un'identità gestita assegnata dal sistema.

Creazione di un'identità gestita assegnata dall'utente

Nota

Per creare una nuova identità gestita assegnata dall'utente, è necessario un ruolo come "Collaboratore identità gestita".

  1. Cercare "Identità gestite" dalla barra di ricerca nella parte superiore del portale e selezionare il risultato corrispondente.

Screenshot of searching for managed identities in the portal.

  1. Selezionare il pulsante "Crea".

Screenshot showing a managed identity create button in the portal.

  1. Selezionare sottoscrizione e gruppo di risorse e immettere un nome per l'identità gestita.

Screenshot showing a managed identity create screen in the portal.

  1. Selezionare "Rivedi e crea" per eseguire il test di convalida e quindi selezionare il pulsante "Crea".

  2. Dopo aver creato l'identità, verrà visualizzata una schermata di conferma.

Screenshot showing a managed identity confirmation screen after creation in the portal.

È ora disponibile un'identità che può essere associata a una risorsa di origine di Azure. Altre informazioni sulla gestione delle identità gestite assegnate dall'utente.

Configurazione della risorsa di origine per l'uso di un'identità gestita assegnata dall'utente

Seguire questa procedura per configurare la risorsa di Azure per avere un'identità gestita tramite il portale. Per informazioni su come configurare l'identità della risorsa usando l'interfaccia della riga di comando, PowerShell o arm, vedere la documentazione relativa al tipo di risorsa specifico.

Nota

Sono necessarie autorizzazioni di scrittura per configurare una risorsa di Azure per avere un'identità assegnata dal sistema. È necessario un ruolo come "Operatore identità gestita" per associare un'identità assegnata dall'utente a una risorsa di Azure.

  1. Individuare la risorsa usando la barra di ricerca nella parte superiore del portale

Screenshot showing a resource being searched for in the portal.

  1. Selezionare il collegamento Identità nel riquadro di spostamento

Screenshot showing the link to the identity screen for a resource in the portal.

  1. Selezionare la scheda "Assegnata dall'utente"

  2. Selezionare il pulsante "Aggiungi"

Screenshot showing a user-assigned identity screen in the portal.

  1. Selezionare l'identità assegnata dall'utente creata in precedenza e selezionare "Aggiungi"

Screenshot showing a user-assigned identity being selected in the portal.

  1. L'identità verrà associata alla risorsa e l'elenco verrà aggiornato.

Screenshot showing a user-assigned identity has been associated with the Azure resource in the portal.

La risorsa di origine ha ora un'identità assegnata dall'utente che può usare per connettersi alle risorse di destinazione.

Aggiunta di autorizzazioni all'identità

Nota

Per aggiungere assegnazioni di ruolo, è necessario un ruolo come "Accesso utente Amministrazione istrator" o "Proprietario" per la risorsa di destinazione. Assicurarsi di concedere il privilegio minimo necessario per l'esecuzione dell'applicazione.

A questo punto, il servizio app ha un'identità gestita, è necessario assegnare all'identità le autorizzazioni corrette. Quando si usa questa identità per interagire con Archiviazione di Azure, si userà il sistema di Controllo di accesso controllo degli accessi in base al ruolo di Azure.

  1. Individuare la risorsa a cui connettersi usando la barra di ricerca nella parte superiore del portale
  2. Selezionare il collegamento "Controllo di accesso (IAM)" nel riquadro di spostamento a sinistra.

Screenshot showing a resource summary screen in the portal.

  1. Selezionare il pulsante "Aggiungi" nella parte superiore della schermata e selezionare "Aggiungi assegnazione di ruolo".

Screenshot showing the add role assignment navigation in the portal.

  1. Verrà visualizzato un elenco di ruoli. È possibile visualizzare le autorizzazioni specifiche di un ruolo selezionando il collegamento "Visualizza". Selezionare il ruolo che si vuole concedere all'identità e selezionare il pulsante "Avanti".

Screenshot showing a role being selected in the portal.

  1. Verrà richiesto di selezionare a chi deve essere concesso il ruolo. Selezionare l'opzione "Identità gestita" e quindi il collegamento "Aggiungi membri".

Screenshot showing the identity type being selected in the portal.

  1. A destra verrà visualizzato un riquadro di contesto in cui è possibile eseguire la ricerca in base al tipo dell'identità gestita. Selezionare "Identità gestita assegnata dall'utente" dall'opzione "Identità gestita".

Screenshot showing managed identity being selected in the portal.

  1. Selezionare l'identità creata in precedenza e il pulsante "Seleziona". Il riquadro del contesto verrà chiuso e l'identità verrà aggiunta all'elenco.

Screenshot showing an identity being added to a resource in the portal.

  1. Selezionare il pulsante "Rivedi e assegna" per visualizzare il riepilogo dell'assegnazione di ruolo e quindi ancora una volta per confermare.
  2. Selezionare l'opzione "Assegnazioni di ruolo" e verrà visualizzato un elenco delle assegnazioni di ruolo per la risorsa.

Screenshot showing the role assignment has been added in the portal.

L'identità gestita dispone ora delle autorizzazioni corrette per accedere alla risorsa di destinazione di Azure. Altre informazioni sulle Controllo di accesso basate sui ruoli di Azure.

Uso dell'identità gestita nel codice

Il servizio app dispone ora di un'identità gestita con autorizzazioni. È possibile usare l'identità gestita nel codice per interagire con le risorse di destinazione, anziché archiviare le credenziali nel codice.

Il metodo consigliato consiste nell'usare la libreria di identità di Azure per il linguaggio di programmazione preferito. I linguaggi supportati includono .NET, Java, JavaScript, Python, Go e C++. La libreria acquisisce i token di accesso per l'utente, semplificando la connessione alle risorse di destinazione.

Uso della libreria di identità di Azure nell'ambiente di sviluppo

Ad eccezione della libreria C++, le librerie di Identità di Azure supportano un DefaultAzureCredential tipo. DefaultAzureCredential tenta automaticamente di eseguire l'autenticazione tramite diversi meccanismi, tra cui variabili di ambiente o accesso interattivo. Il tipo Credential può essere usato nell'ambiente di sviluppo usando le proprie credenziali. Può essere usato anche nell'ambiente di produzione di Azure usando un'identità gestita. Non sono necessarie modifiche al codice quando si distribuisce l'applicazione.

Se si usano identità gestite assegnate dall'utente, è anche necessario specificare in modo esplicito l'identità gestita assegnata dall'utente con cui si vuole eseguire l'autenticazione passando l'ID client dell'identità come parametro. È possibile recuperare l'ID client passando all'identità nel portale.

Screenshot showing the client ID for the managed identity in the portal.

Altre informazioni sulle librerie di identità di Azure sono disponibili di seguito:

Accesso a un BLOB in Archiviazione di Azure

using Azure.Identity;
using Azure.Storage.Blobs;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);                        

var blobServiceClient1 = new BlobServiceClient(new Uri("<URI of Storage account>"), credential);
BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient("<name of blob>");
BlobClient blobClient1 = containerClient1.GetBlobClient("<name of file>");

if (blobClient1.Exists())
{
    var downloadedBlob = blobClient1.Download();
    string blobContents = downloadedBlob.Value.Content.ToString();                
}

Accesso a un segreto archiviato in Azure Key Vault

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);        

var client = new SecretClient(
    new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"),
    credential);
    
KeyVaultSecret secret = client.GetSecret("<my secret>");
string secretValue = secret.Value;

Accesso a database SQL di Azure

using Azure.Identity;
using Microsoft.Data.SqlClient;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};

AccessToken accessToken = await new DefaultAzureCredential(credentialOptions).GetTokenAsync(
    new TokenRequestContext(new string[] { "https://database.windows.net//.default" }));                        

using var connection = new SqlConnection("Server=<DB Server>; Database=<DB Name>;")
{
    AccessToken = accessToken.Token
};
var cmd = new SqlCommand("select top 1 ColumnName from TableName", connection);
await connection.OpenAsync();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
    Console.WriteLine(dr.GetValue(0).ToString());
}
dr.Close();	

Connessione alle risorse che non supportano l'AUTENTICAZIONE basata su token o ID Entra di Microsoft nelle librerie

Alcune risorse di Azure non supportano ancora l'autenticazione di Microsoft Entra o le librerie client non supportano l'autenticazione con un token. In genere queste risorse sono tecnologie open source che prevedono un nome utente e una password o una chiave di accesso in un stringa di connessione.

Per evitare di archiviare le credenziali nel codice o nella configurazione dell'applicazione, è possibile archiviare le credenziali come segreto in Azure Key Vault. Usando l'esempio riportato sopra, è possibile recuperare il segreto da Azure KeyVault usando un'identità gestita e passare le credenziali all'stringa di connessione. Questo approccio significa che non è necessario gestire le credenziali direttamente nel codice o nell'ambiente.

Linee guida per la gestione diretta dei token

In alcuni scenari, è possibile acquisire manualmente i token per le identità gestite anziché usare un metodo predefinito per connettersi alla risorsa di destinazione. Questi scenari includono nessuna libreria client per il linguaggio di programmazione usato o la risorsa di destinazione a cui ci si connette o la connessione alle risorse che non sono in esecuzione in Azure. Quando si acquisiscono i token manualmente, vengono fornite le linee guida seguenti:

Memorizzare nella cache i token acquisiti

Per prestazioni e affidabilità, è consigliabile che l'applicazione memorizza nella cache i token nella memoria locale o crittografati se si desidera salvarli su disco. Poiché i token di identità gestita sono validi per 24 ore, non c'è alcun vantaggio nella richiesta di nuovi token regolarmente, perché ne verrà restituito uno memorizzato nella cache dall'endpoint emittente del token. Se si superano i limiti delle richieste, si otterrà un limite di frequenza e si riceverà un errore HTTP 429.

Quando si acquisisce un token, è possibile impostare la cache dei token per scadere 5 minuti prima della expires_on proprietà (o equivalente) che verrà restituita quando viene generato il token.

Ispezione dei token

L'applicazione non deve basarsi sul contenuto di un token. Il contenuto del token è destinato solo al gruppo di destinatari (risorsa di destinazione) a cui si accede, non al client che richiede il token. Il contenuto del token può cambiare o essere crittografato in futuro.

Non esporre o spostare token

I token devono essere considerati come credenziali. Non esporli agli utenti o ad altri servizi; ad esempio, soluzioni di registrazione/monitoraggio. Non devono essere spostati dalla risorsa di origine che li usa, ad eccezione dell'autenticazione nella risorsa di destinazione.

Passaggi successivi