Connessione dall'applicazione alle risorse senza gestire le credenziali

Le risorse di Azure con identità gestite supportano sempre un'opzione per specificare un'identità gestita per connettersi alle risorse di Azure che supportano l'autenticazione di Azure Active Directory. Il supporto delle identità gestite rende non necessario per gli sviluppatori gestire le credenziali nel codice. Le identità gestite sono l'opzione di autenticazione consigliata quando si riguardano le risorse di Azure che li 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 connettono alle risorse che supportano l'autenticazione di Azure Active Directory.

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

Quali risorse possono connettersi alle identità gestite?

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

Alcune risorse non supportano l'autenticazione di Azure Active Directory o la libreria client non supporta l'autenticazione con un token. Continuare a leggere 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, quindi è l'identità. Un'identità gestita assegnata dall'utente può essere associata a più risorse di Azure e il suo 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 usata 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

È necessario un ruolo come "Collaboratore identità gestita" per creare una nuova identità gestita assegnata dall'utente.

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

Screenshot della ricerca di identità gestite nel portale.

  1. Selezionare il pulsante "Crea".

Screenshot che mostra un pulsante di creazione dell'identità gestita nel portale.

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

Screenshot che mostra una schermata di creazione di identità gestita nel portale.

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

  2. Quando l'identità è stata creata, verrà visualizzata una schermata di conferma.

Screenshot che mostra una schermata di conferma dell'identità gestita dopo la creazione nel portale.

È 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 "Write" 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 che mostra una risorsa da cercare nel portale.

  1. Selezionare il collegamento Identity nella navigazione

Screenshot che mostra il collegamento alla schermata identity per una risorsa nel portale.

  1. Selezionare la scheda "Assegnata dall'utente"

  2. Selezionare il pulsante "Aggiungi"

Screenshot che mostra una schermata di identità assegnata dall'utente nel portale.

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

Screenshot che mostra un'identità assegnata dall'utente selezionata nel portale.

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

Screenshot che mostra un'identità assegnata dall'utente è stata associata alla risorsa di Azure nel portale.

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

Aggiunta di autorizzazioni all'identità

Nota

È necessario un ruolo, ad esempio "Amministratore accesso utente" o "Proprietario" per la risorsa di destinazione per aggiungere assegnazioni di ruolo. Assicurarsi di concedere il privilegio minimo necessario per l'esecuzione dell'applicazione.

A questo punto, la servizio app ha un'identità gestita, sarà necessario concedere all'identità le autorizzazioni corrette. Quando si usa questa identità per interagire con Archiviazione di Azure, si userà il sistema azure Role Based Controllo di accesso (RBAC).

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

Screenshot che mostra una schermata di riepilogo delle risorse nel portale.

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

Screenshot che mostra lo spostamento dell'assegnazione di ruolo nel portale.

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

Screenshot che mostra un ruolo selezionato nel portale.

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

Screenshot che mostra il tipo di identità selezionato nel portale.

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

Screenshot che mostra l'identità gestita selezionata nel portale.

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

Screenshot che mostra un'identità da aggiungere a una risorsa nel portale.

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

Screenshot che mostra l'assegnazione di ruolo aggiunta nel portale.

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

Uso dell'identità gestita nel codice

Il servizio app ora dispone 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 più meccanismi, incluse le variabili di ambiente o un accesso interattivo. Il tipo di credenziale 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 che mostra l'ID client per l'identità gestita nel portale.

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 al database Azure SQL

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 a risorse che non supportano l'autenticazione basata su token o Azure Active Directory nelle librerie

Alcune risorse di Azure non supportano ancora l'autenticazione di Azure Active Directory 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 una 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 alla 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 manualmente i token, vengono fornite le linee guida seguenti:

Memorizzare nella cache i token acquisiti

Per prestazioni e affidabilità, è consigliabile memorizzare nella cache i token nella memoria locale o crittografati se si vuole salvarli su disco. Poiché i token di identità gestiti 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 di emissione del token. Se si superano i limiti delle richieste, si riceverà un errore HTTP 429 limitato 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 con la risorsa di destinazione.

Passaggi successivi