Condividi tramite


Autenticare le app Go ospitate in Azure con un'identità gestita assegnata dal sistema

L'approccio consigliato per autenticare un'app ospitata in Azure in altre risorse di Azure consiste nell'usare un'identità gestita. Questo approccio è supportato per la maggior parte dei servizi di Azure, incluse le app ospitate nel servizio app di Azure, nelle app di Azure Container e nelle macchine virtuali di Azure. Altre informazioni sulle diverse tecniche e approcci di autenticazione sono disponibili nella pagina di panoramica dell'autenticazione . Nelle sezioni successive si apprenderà quanto descritto di seguito:

  • Concetti essenziali relativi all'identità gestita
  • Come creare un'identità gestita assegnata dal sistema per l'app
  • Come assegnare ruoli all'identità gestita assegnata dal sistema
  • Come eseguire l'autenticazione usando l'identità gestita assegnata dal sistema dal codice dell'app

Concetti essenziali relativi all'identità gestita

Un'identità gestita consente all'app di connettersi in modo sicuro ad altre risorse di Azure senza usare chiavi segrete o altri segreti dell'applicazione. Internamente, Azure tiene traccia dell'identità e delle risorse a cui è consentito connettersi. Azure usa queste informazioni per ottenere automaticamente i token di Microsoft Entra per consentire all'app di connettersi ad altre risorse di Azure.

Esistono due tipi di identità gestite da considerare durante la configurazione dell'app ospitata:

  • Le identità gestite assegnate dal sistema sono abilitate direttamente in una risorsa di Azure e sono associate al ciclo di vita. Quando la risorsa viene eliminata, Azure elimina l'identità per te automaticamente. Le identità assegnate dal sistema offrono un approccio minimalista all'uso delle identità gestite.
  • Le identità gestite assegnate dall'utente vengono create come risorse di Azure autonome e offrono maggiore flessibilità e funzionalità. Sono ideali per soluzioni che coinvolgono più risorse di Azure che devono condividere la stessa identità e le stesse autorizzazioni. Ad esempio, se più macchine virtuali devono accedere allo stesso set di risorse di Azure, un'identità gestita assegnata dall'utente offre la riutilizzabilità e la gestione ottimizzata.

Suggerimento

Altre informazioni sulla selezione e sulla gestione delle identità gestite assegnate dal sistema e assegnate dall'utente sono disponibili nell'articolo Raccomandazioni sulle procedure consigliate sulle identità gestite .

Le sezioni seguenti descrivono i passaggi per abilitare e usare un'identità gestita assegnata dal sistema per un'app ospitata in Azure. Se è necessario usare un'identità gestita assegnata dall'utente, vedere l'articolo Identità gestite assegnate dall'utente per altre informazioni.

Abilitare un'identità gestita assegnata dal sistema nella risorsa di hosting di Azure

Per iniziare a usare un'identità gestita assegnata dal sistema con l'app, abilitare l'identità nella risorsa di Azure che ospita l'app, ad esempio un servizio app di Azure, un'app Azure Container o una macchina virtuale di Azure.

È possibile abilitare un'identità gestita assegnata dal sistema per una risorsa di Azure usando il portale di Azure o l'interfaccia della riga di comando di Azure.

  1. Nel portale di Azure passare alla risorsa che ospita il codice dell'applicazione, ad esempio un servizio app di Azure o un'istanza dell'app Azure Container.

  2. Nella pagina Panoramica della risorsa espandere Impostazioni e selezionare Identità nel riquadro di spostamento.

  3. Nella pagina Identità attivare o disattivare il dispositivo di scorrimento Stato su .

  4. Seleziona Salva per applicare le modifiche.

    Screenshot che mostra come abilitare un'identità gestita assegnata dal sistema in un'app contenitore.

Assegnare ruoli all'identità gestita

Successivamente, determinare i ruoli necessari per l'app e assegnare tali ruoli all'identità gestita. È possibile assegnare ruoli a un'identità gestita negli ambiti seguenti:

  • Risorsa: i ruoli assegnati si applicano solo a tale risorsa specifica.
  • Gruppo di risorse: i ruoli assegnati si applicano a tutte le risorse contenute nel gruppo di risorse.
  • Sottoscrizione: i ruoli assegnati si applicano a tutte le risorse contenute nella sottoscrizione.

L'esempio seguente illustra come assegnare ruoli nell'ambito del gruppo di risorse, poiché molte app gestiscono tutte le risorse di Azure correlate usando un singolo gruppo di risorse.

  1. Passare alla pagina Panoramica del gruppo di risorse che contiene l'app con l'identità gestita assegnata dal sistema.

  2. Selezionare Controllo di accesso (IAM) nel riquadro di spostamento sinistro.

  3. Nella pagina Controllo di accesso (IAM) selezionare + Aggiungi nel menu in alto e quindi scegliere Aggiungi assegnazione di ruolo per passare alla pagina Aggiungi assegnazione di ruolo .

    Screenshot che mostra come accedere alla pagina di assegnazione dei ruoli di identità.

  4. La pagina Aggiungi assegnazione di ruolo presenta un flusso di lavoro a schede in più passaggi per assegnare ruoli alle identità. Nella scheda Ruolo iniziale usare la casella di ricerca nella parte superiore per individuare il ruolo da assegnare all'identità.

  5. Selezionare il ruolo nei risultati e quindi scegliere Avanti per passare alla scheda Membri .

  6. Per l'opzione Assegna accesso a selezionare Identità gestita.

  7. Per l'opzione Membri scegliere + Seleziona membri per aprire il pannello Seleziona identità gestite .

  8. Nel pannello Seleziona identità gestite usare gli elenchi a discesa Sottoscrizione e Identità gestita per filtrare i risultati della ricerca per le identità. Usare la casella di ricerca Seleziona per individuare l'identità di sistema abilitata per la risorsa di Azure che ospita l'app.

    Screenshot che mostra il processo di assegnazione dell'identità gestita.

  9. Selezionare l'identità e scegliere Seleziona nella parte inferiore del pannello per continuare.

  10. Selezionare Rivedi e assegna nella parte inferiore della pagina.

  11. Nella scheda Finale Rivedi e assegna selezionare Rivedi e assegna per completare il flusso di lavoro.

Eseguire l'autenticazione ai servizi di Azure dall'app

Il modulo azidentity fornisce varie credenziali : implementazioni di TokenCredential adattate al supporto di diversi scenari e flussi di autenticazione di Microsoft Entra. Poiché l'identità gestita non è disponibile durante l'esecuzione in locale, i passaggi successivi illustrano quali credenziali usare in quale scenario:

  • Ambiente di sviluppo locale: solo durante lo sviluppo locale, usare DefaultAzureCredential per una catena di credenziali preconfigurata e con opinioni. DefaultAzureCredential individua le credenziali utente dagli strumenti di sviluppo locali, ad esempio l'interfaccia della riga di comando di Azure. Offre inoltre flessibilità e praticità per i tentativi, i tempi di attesa per le risposte e il supporto per più opzioni di autenticazione. Per altre informazioni, vedere l'articolo Eseguire l'autenticazione ai servizi di Azure durante lo sviluppo locale .
  • App ospitate in Azure: quando l'app è in esecuzione in Azure, usare ManagedIdentityCredential per individuare in modo sicuro l'identità gestita configurata per l'app. La specifica di questo tipo esatto di credenziali impedisce che altre credenziali disponibili vengano prelevate in modo imprevisto.

Implementare il codice

Aggiungere il modulo azidentity .

In un terminale di propria scelta passare alla directory del progetto dell'applicazione ed eseguire i comandi seguenti:

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

È possibile accedere ai servizi di Azure usando client specializzati dalle varie librerie client di Azure SDK. Per qualsiasi codice Go che crea un'istanza di un client Azure SDK nell'app, è necessario:

  1. Importare il pacchetto azidentity.
  2. Creare un'istanza di tipo DefaultAzureCredential.
  3. Passare l'istanza di tipo DefaultAzureCredential al costruttore del client Azure SDK.
  4. Impostare la AZURE_TOKEN_CREDENTIALS variabile di ambiente su ManagedIdentityCredential per assicurarsi che DefaultAzureCredential usi solo le credenziali dell'identità gestita. Questa procedura rende l'autenticazione più prevedibile e più semplice da eseguire durante la distribuzione in Azure. Per altre informazioni, vedere Usare credenziali specifiche.

Un esempio di questi passaggi è mostrato nel segmento di codice seguente con un client Blob di Azure Storage.

import (
	"context"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

const (
	account       = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
	containerName = "sample-container"
	blobName      = "sample-blob"
	sampleFile    = "path/to/sample/file"
)

func main() {
	// create a credential
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	if err != nil {
	  // TODO: handle error
	}

	// create a client for the specified storage account
	client, err := azblob.NewClient(account, cred, nil)
	if err != nil {
	  // TODO: handle error
	}

	// TODO: perform some action with the azblob Client
	// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}

Come descritto nell'articolo panoramica dell'autenticazione di Azure SDK for Go, DefaultAzureCredential supporta più metodi di autenticazione e determina il metodo di autenticazione usato in fase di esecuzione. Il vantaggio di questo approccio è che l'app può usare metodi di autenticazione diversi in ambienti diversi senza implementare codice specifico dell'ambiente. Quando il codice precedente viene eseguito sulla workstation durante lo sviluppo locale, DefaultAzureCredential utilizza un'entità servizio applicativa, determinata dalle impostazioni dell'ambiente, oppure le credenziali dello strumento di sviluppo per autenticarsi con altre risorse di Azure. Di conseguenza, lo stesso codice può essere usato per autenticare l'app nelle risorse di Azure durante lo sviluppo locale e quando viene distribuito in Azure.

Importante

DefaultAzureCredential semplifica l'autenticazione durante lo sviluppo di applicazioni distribuite in Azure combinando le credenziali usate negli ambienti di hosting di Azure e le credenziali usate nello sviluppo locale. Nell'ambiente di produzione è preferibile usare un tipo di credenziale specifico, in modo che l'autenticazione sia più prevedibile e più semplice da eseguire.

Un'alternativa a DefaultAzureCredential consiste nell'usare ManagedIdentityCredential. I passaggi per l'utilizzo ManagedIdentityCredential sono uguali a per l'uso del DefaultAzureCredential tipo .

Un esempio di questi passaggi è mostrato nel segmento di codice seguente con un client Blob di Azure Storage.

import (
	"context"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

const (
                    // Replace placeholder text with your storage account name
	account       = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
	containerName = "sample-container"
	blobName      = "sample-blob"
	sampleFile    = "path/to/sample/file"
)

func main() {
	// create a credential
	cred, err := azidentity.NewManagedIdentityCredential(nil)
	
	// When using User Assigned Managed Identity use this instead and pass your client id in the options
	// clientID := azidentity.ClientID("abcd1234-...")
	// opts := azidentity.ManagedIdentityCredentialOptions{ID: clientID}
	// cred, err := azidentity.NewManagedIdentityCredential(&opts)
	
	if err != nil {
	  // TODO: handle error
	}
	
	// create a client for the specified storage account
	client, err := azblob.NewClient(account, cred, nil)
	if err != nil {
	  // TODO: handle error
	}
	
	// TODO: perform some action with the azblob Client
	// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}