Condividi tramite


Catene di credenziali nella libreria client di Identità di Azure per Go

La libreria client di Azure Identity fornisce credenziali— tipi pubblici che implementano l'interfaccia TokenCredential della libreria Core di Azure. Una credenziale rappresenta un flusso di autenticazione distinto per l'acquisizione di un token di accesso da Microsoft Entra ID. Queste credenziali possono essere concatenate per formare una sequenza ordinata di meccanismi di autenticazione da tentare.

Funzionamento di una credenziale concatenata

In fase di esecuzione, una catena di credenziali tenta di eseguire l'autenticazione usando la prima credenziale della sequenza. Se tale credenziale non riesce ad acquisire un token di accesso, viene tentata la credenziale successiva nella sequenza e così via finché non viene ottenuto correttamente un token di accesso. Il diagramma di sequenza seguente illustra questo comportamento:

Diagramma che mostra la sequenza di catena di credenziali.

Perché usare catene di credenziali

Una credenziale concatenata può offrire i seguenti vantaggi:

  • Consapevolezza dell'ambiente: seleziona automaticamente le credenziali più appropriate in base all'ambiente in cui l'app è in esecuzione. Senza di esso, è necessario scrivere codice simile al seguente:

    // Set up credential based on environment (Azure or local development)
    if os.Getenv("WEBSITE_HOSTNAME") != "" {
        clientID := azidentity.ClientID("abcd1234-...")
        opts := azidentity.ManagedIdentityCredentialOptions{ID: clientID}
        cred, err := azidentity.NewManagedIdentityCredential(&opts)
    
        if err != nil {
          // TODO: handle error
        }
    }
    else {
        // Use Azure CLI Credential
        credential, err = azidentity.NewAzureCLICredential(nil)
    
        if err != nil {
          // TODO: handle error
        }
    }
    
  • transizioni semplici: l'app può passare dallo sviluppo locale all'ambiente di staging o di produzione senza modificare il codice di autenticazione.

  • Miglioramento della resilienza: include un meccanismo di fallback che passa alla credenziale successiva quando quella precedente non riesce ad acquisire un token di accesso.

Come scegliere una credenziale concatenata

Con Go sono disponibili due opzioni per il concatenamento delle credenziali:

  • Usare una catena preconfigurata: usare la catena preconfigurata implementata dal tipo di DefaultAzureCredential. Per questo approccio, vedere la sezione panoramica di DefaultAzureCredential.
  • Creare una catena di credenziali personalizzata: iniziare con una catena vuota e includere solo ciò che serve. Per questo approccio, vedere la sezione panoramica di ChainedTokenCredential .

Panoramica di DefaultAzureCredential

DefaultAzureCredential è una catena di credenziali preconfigurata e strutturata con un'opinione precisa. È progettato per supportare molti ambienti, insieme ai flussi di autenticazione e agli strumenti di sviluppo più comuni. In forma grafica, la catena sottostante è simile alla seguente:

Diagramma che mostra il flusso di autenticazione DefaultAzureCredential.

L'ordine in cui DefaultAzureCredential prova le credenziali è il seguente.

Ordine Credenziali Descrizione
1 Ambiente Legge una raccolta di variabili di ambiente per determinare se un'entità servizio dell'applicazione (utente dell'applicazione) sia configurata per l'applicazione. In tal caso, DefaultAzureCredential usa questi valori per autenticare l'app in Azure. Questo metodo viene usato più spesso negli ambienti server, ma può essere usato anche durante lo sviluppo in locale.
2 Identità del Carico di Lavoro Se l'app è distribuita in un host di Azure con Identità di Workload abilitata, autentica l'account.
3 Identità Gestita Se l'app viene distribuita in un host di Azure con identità gestita abilitata, autenticare l'app in Azure usando tale identità gestita.
4 Azure Interfaccia della riga di comando Se lo sviluppatore si è autenticato su Azure utilizzando il comando az login dell'Azure CLI, autentica l'app in Azure usando lo stesso account.
5 Azure Developer CLI Se lo sviluppatore ha eseguito l'autenticazione in Azure usando il comando azd auth login dell'interfaccia della riga di comando per sviluppatori di Azure, eseguire l'autenticazione con tale account.

Nella sua forma più semplice, è possibile usare la versione senza parametri di DefaultAzureCredential come indicato di seguito:

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

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

// create a Blob service client 
accountURL := "https://<my_account_name>.blob.core.windows.net"
client, err := azblob.NewClient(accountURL, credential, nil)
if err != nil {
    // TODO: handle error
}

Panoramica di ChainedTokenCredential

ChainedTokenCredential è una catena vuota a cui aggiungi le credenziali in base alle esigenze della tua app. Per esempio:

managed, err := azidentity.NewManagedIdentityCredential(nil)
if err != nil {
  // handle error
}

azCLI, err := azidentity.NewAzureCLICredential(nil)
if err != nil {
  // handle error
}

chain, err := azidentity.NewChainedTokenCredential([]azcore.TokenCredential{managed, azCLI}, nil)
if err != nil {
  // handle error
}

L'esempio di codice precedente crea una catena di credenziali personalizzata costituita da due credenziali. Si tenta ManagedIdentityCredential per primo, seguito da AzureCliCredential, se necessario. In forma grafica, la catena è simile alla seguente:

Diagramma che mostra il flusso di autenticazione per un'istanza di ChainedTokenCredential composta da credenziali di identità gestite e credenziali CLI di Azure.

Suggerimento

Per migliorare le prestazioni, ottimizza l'ordinamento delle credenziali in ChainedTokenCredential per il tuo ambiente di produzione. Le credenziali destinate all'uso nell'ambiente di sviluppo locale devono essere aggiunte per ultimo.

Indicazioni sull'utilizzo per DefaultAzureCredential

DefaultAzureCredential è senza dubbio il modo più semplice per iniziare a usare la libreria client di Identità di Azure, ma con tale praticità si verifica un compromesso. Dopo aver distribuito l'app in Azure, è necessario comprendere i requisiti di autenticazione dell'app. Per questo motivo, è consigliabile passare da DefaultAzureCredential a una delle soluzioni seguenti:

  • Un'implementazione specifica di credenziali, ad esempio ManagedIdentityCredential.
  • Implementazione ChainedTokenCredential ridotta e ottimizzata per l'ambiente Azure su cui è in esecuzione la tua app.

Ecco perché:

  • problemi di debug: quando l'autenticazione non riesce, può essere difficile eseguire il debug e identificare le credenziali che causano errori. È necessario abilitare la registrazione per visualizzare l'avanzamento da una credenziale alla successiva e lo stato di esito positivo/negativo di ognuno di essi. Per ulteriori informazioni, consultare Risolvere i problemi di una credenziale concatenata.
  • sovraccarico delle prestazioni: il processo di tentativo sequenziale di più credenziali può comportare un sovraccarico delle prestazioni. Ad esempio, quando viene eseguito su una macchina di sviluppo locale, l'identità gestita non è disponibile. Di conseguenza, ManagedIdentityCredential fallisce sempre nell'ambiente di sviluppo locale, a meno che non venga disabilitato in modo esplicito tramite la proprietà corrispondente con prefisso exclude.
  • comportamento imprevedibile: DefaultAzureCredential verifica la presenza di determinate variabili di ambiente . È possibile che un utente possa aggiungere o modificare queste variabili di ambiente a livello di sistema nel computer host. Tali modifiche si applicano a livello globale e quindi modificano il comportamento di DefaultAzureCredential in fase di esecuzione in qualsiasi app in esecuzione in tale computer.

Eseguire il debug di credenziali concatenate

Per diagnosticare un problema imprevisto o comprendere le operazioni di una credenziale concatenata, abilitare la registrazione dei log nella tua app. Opzionalmente, filtrare i log per mostrare solo gli eventi generati dalla libreria client di Azure Identity. Per esempio:

import azlog "github.com/Azure/azure-sdk-for-go/sdk/azcore/log"
// print log output to stdout
azlog.SetListener(func(event azlog.Event, s string) {
    fmt.Println(s)
})
// include only azidentity credential logs
azlog.SetEvents(azidentity.EventAuthentication)

Per indicazioni sulla risoluzione degli errori da tipi di credenziali specifici, vedere la guida alla risoluzione dei problemi .