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".
- Cercare "Identità gestite" dalla barra di ricerca nella parte superiore del portale e selezionare il risultato corrispondente.
- Selezionare il pulsante "Crea".
- Selezionare sottoscrizione e gruppo di risorse e immettere un nome per l'identità gestita.
Selezionare "Rivedi e crea" per eseguire il test di convalida e quindi selezionare il pulsante "Crea".
Dopo aver creato l'identità, verrà visualizzata una schermata di conferma.
È 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.
- Individuare la risorsa usando la barra di ricerca nella parte superiore del portale
- Selezionare il collegamento Identità nel riquadro di spostamento
Selezionare la scheda "Assegnata dall'utente"
Selezionare il pulsante "Aggiungi"
- Selezionare l'identità assegnata dall'utente creata in precedenza e selezionare "Aggiungi"
- L'identità verrà associata alla risorsa e l'elenco verrà aggiornato.
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.
- Individuare la risorsa a cui connettersi usando la barra di ricerca nella parte superiore del portale
- Selezionare il collegamento "Controllo di accesso (IAM)" nel riquadro di spostamento a sinistra.
- Selezionare il pulsante "Aggiungi" nella parte superiore della schermata e selezionare "Aggiungi assegnazione di ruolo".
- 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".
- Verrà richiesto di selezionare a chi deve essere concesso il ruolo. Selezionare l'opzione "Identità gestita" e quindi il collegamento "Aggiungi membri".
- 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".
- Selezionare l'identità creata in precedenza e il pulsante "Seleziona". Il riquadro del contesto verrà chiuso e l'identità verrà aggiunta all'elenco.
- Selezionare il pulsante "Rivedi e assegna" per visualizzare il riepilogo dell'assegnazione di ruolo e quindi ancora una volta per confermare.
- Selezionare l'opzione "Assegnazioni di ruolo" e verrà visualizzato un elenco delle assegnazioni di ruolo per la risorsa.
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.
Altre informazioni sulle librerie di identità di Azure sono disponibili di seguito:
- Libreria di identità di Azure per .NET
- Libreria di identità di Azure per Java
- Libreria di identità di Azure per JavaScript
- Libreria di identità di Azure per Python
- Modulo Identità di Azure per Go
- Libreria di identità di Azure per C++
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
- Come usare le identità gestite nel servizio app e in Funzioni di Azure
- Come usare identità gestite con Istanze di Azure Container
- Implementazione di identità gestite per le risorse di Microsoft Azure
- Usare la federazione delle identità del carico di lavoro per le identità gestite per accedere alle risorse protette di Microsoft Entra senza gestire i segreti