Compartir a través de


Cadenas de credenciales en la biblioteca cliente de Identidad de Azure para Go

La biblioteca cliente de Identidad de Azure proporciona credenciales : tipos públicos que implementan la interfaz TokenCredential de la biblioteca de Azure Core. Una credencial representa un flujo de autenticación distinto para adquirir un token de acceso de Microsoft Entra ID. Estas credenciales se pueden encadenar para formar una secuencia ordenada de mecanismos de autenticación que se van a intentar.

Funcionamiento de una credencial encadenada

En tiempo de ejecución, una cadena de credenciales intenta autenticarse mediante la primera credencial de la secuencia. Si esa credencial no puede adquirir un token de acceso, se intenta realizar la siguiente credencial de la secuencia, etc., hasta que se obtenga correctamente un token de acceso. En el diagrama de secuencia siguiente se muestra este comportamiento:

Diagrama que muestra la secuencia de la cadena de credenciales.

¿Por qué usar cadenas de credenciales?

Una credencial encadenada puede ofrecer las siguientes ventajas:

  • reconocimiento del entorno: selecciona automáticamente la credencial más adecuada en función del entorno en el que se ejecuta la aplicación. Sin él, tendría que escribir código como este:

    // 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
        }
    }
    
  • transiciones sin problemas: la aplicación puede pasar del desarrollo local al entorno de ensayo o producción sin cambiar el código de autenticación.

  • Resistencia mejorada: incluye un mecanismo de reserva que pasa a la siguiente credencial cuando la anterior no puede adquirir un token de acceso.

Cómo elegir una credencial encadenada

Con Go, hay dos opciones para el encadenamiento de credenciales:

Introducción a DefaultAzureCredential

DefaultAzureCredential es una cadena preconfigurada de credenciales fundamentada. Está diseñado para admitir muchos entornos, junto con los flujos de autenticación y las herramientas de desarrollo más comunes. En forma gráfica, la cadena subyacente tiene este aspecto:

Diagrama que muestra el flujo de autenticación DefaultAzureCredential.

Orden en el que DefaultAzureCredential intenta las credenciales.

compra Credential: Descripción
1 Entorno Lee una colección de variables de entorno para determinar si una entidad de servicio de aplicación (usuario de aplicación) está configurada para la aplicación. Si es así, DefaultAzureCredential usa estos valores para autenticar la aplicación en Azure. Este método se usa con más frecuencia en entornos de servidor, pero también se puede usar al desarrollar localmente.
2 Identidad de carga de trabajo Si la aplicación se implementa en un host de Azure con la identidad de carga de trabajo habilitada, autentíquela.
3 Identidad Administrada Si la aplicación se implementa en un host de Azure con identidad administrada habilitada, autentíquela en Azure mediante esa identidad administrada.
4 CLI de Azure Si el desarrollador se autentica en Azure mediante el comando az login de la CLI de Azure, autentíquela en Azure con esa misma cuenta.
5 CLI para desarrolladores de Azure Si el desarrollador se autentica en Azure mediante el comando azd auth login de la CLI para desarrolladores de Azure, autentíquese con esa cuenta.

En su forma más sencilla, puede usar la versión sin parámetros de DefaultAzureCredential de la siguiente manera:

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
}

Introducción a ChainedTokenCredential

ChainedTokenCredential es una cadena vacía a la que agregas credenciales para satisfacer las necesidades de la aplicación. Por ejemplo:

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
}

El ejemplo de código anterior crea una cadena de credenciales adaptada formada por dos credenciales. Se intenta ManagedIdentityCredential primero, seguido de AzureCliCredential, si es necesario. En forma gráfica, la cadena tiene el siguiente aspecto:

Diagrama que muestra el flujo de autenticación de una instancia ChainedTokenCredential compuesta por credenciales de identidad administrada y credenciales de la CLI de Azure.

Sugerencia

Para mejorar el rendimiento, optimice el orden de credenciales en ChainedTokenCredential para el entorno de producción. Las credenciales diseñadas para su uso en el entorno de desarrollo local deben agregarse en último lugar.

Guía de uso para DefaultAzureCredential

DefaultAzureCredential es sin duda la forma más sencilla de comenzar a trabajar con la biblioteca cliente de Azure Identity, pero con esa comodidad conlleva ciertos compromisos. Una vez que implemente la aplicación en Azure, debe comprender los requisitos de autenticación de la aplicación. Por ese motivo, considere encarecidamente la posibilidad de pasar de DefaultAzureCredential a una de las siguientes soluciones:

  • Una implementación de credencial específica, como ManagedIdentityCredential.
  • Una implementación ChainedTokenCredential simplificada optimizada para el entorno de Azure donde se ejecuta tu aplicación.

Este es el motivo:

  • Desafíos de Depuración: Cuando se produce un error en la autenticación, puede resultar desafiante depurar e identificar la credencial problemática. Debe habilitar el registro para ver la progresión de una credencial a la siguiente y el estado de éxito o error de cada una. Para obtener más información, consulte Depuración de una credencial encadenada.
  • sobrecarga de rendimiento: el proceso de probar secuencialmente varias credenciales puede suponer una sobrecarga de rendimiento. Por ejemplo, cuando se ejecuta en una máquina de desarrollo local, la identidad administrada no está disponible. Por lo tanto, ManagedIdentityCredential siempre falla en el entorno de desarrollo local, a menos que se deshabilite explícitamente a través de su propiedad con prefijo exclude correspondiente.
  • comportamiento imprevisible: DefaultAzureCredential comprueba la presencia de determinadas variables de entorno . Es posible que alguien pueda agregar o modificar estas variables de entorno en el nivel de sistema en el equipo host. Esos cambios se aplican globalmente y, por tanto, modifican el comportamiento de DefaultAzureCredential en tiempo de ejecución en cualquier aplicación que se ejecute en esa máquina.

Depuración de una credencial encadenada

Para diagnosticar un problema inesperado o comprender lo que hace una credencial encadenada, habilite el registro en la aplicación. Opcionalmente, filtre los registros solo a esos eventos emitidos desde la biblioteca cliente de identidades de Azure. Por ejemplo:

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)

Para obtener instrucciones sobre cómo resolver errores de tipos de credenciales específicos, consulte la guía de solución de problemas de .