Autenticación de aplicaciones .NET en servicios de Azure mediante el SDK de Azure de .NET

Cuando una aplicación necesita acceder a un recurso de Azure, como el almacenamiento, el almacén de claves o cognitive Services, la aplicación debe autenticarse en Azure. Esto es cierto para todas las aplicaciones, ya sea implementadas en Azure, implementadas localmente o en desarrollo en una estación de trabajo para desarrolladores local. En este artículo se describen los enfoques recomendados para autenticar una aplicación en Azure al usar el SDK de Azure para .NET.

Se recomienda que las aplicaciones usen la autenticación basada en tokens en lugar de cadenas de conexión al autenticarse en recursos de Azure. El SDK de Azure para .NET proporciona clases que admiten la autenticación basada en tokens y permiten que las aplicaciones se autentiquen sin problemas en los recursos de Azure si la aplicación está en desarrollo local, implementada en Azure o implementada en un servidor local.

El tipo específico de autenticación basada en tokens que una aplicación debe usar para autenticarse en los recursos de Azure depende de dónde se ejecuta la aplicación y se muestra en el diagrama siguiente.

Un diagrama mostrando las estrategias de autenticación basadas en tokens para una aplicación dependiendo de dónde se está ejecutando.

  • Cuando un desarrollador ejecuta una aplicación durante el desarrollo local: La aplicación puede autenticarse en Azure mediante una entidad de servicio de aplicación para el desarrollo local o mediante las credenciales de Azure del desarrollador. Cada una de estas opciones se describe con más detalle en la sección autenticación durante el desarrollo local.
  • Cuando una aplicación se hospeda en Azure: La aplicación debe autenticarse en recursos de Azure mediante una identidad administrada. Esta opción se describe con más detalle a continuación en la sección autenticación en entornos de servidor.
  • Cuando una aplicación se hospeda e implementa en el entorno local: La aplicación debe autenticarse en recursos de Azure mediante una entidad de servicio de la aplicación. Esta opción se describe con más detalle a continuación en la sección autenticación en entornos de servidor.

DefaultAzureCredential

La DefaultAzureCredential clase proporcionada por el SDK de Azure permite a las aplicaciones usar diferentes métodos de autenticación en función del entorno en el que se ejecutan. Esto permite que las aplicaciones se promuevan desde el desarrollo local hasta entornos de prueba a producción sin cambios en el código. Configura el método de autenticación adecuado para cada entorno y DefaultAzureCredential detectará y usará automáticamente ese método de autenticación. El uso de DefaultAzureCredential debe ser preferido sobre la codificación manual de la lógica condicional o las marcas de características para usar diferentes métodos de autenticación en diferentes entornos.

Los detalles sobre el uso de la DefaultAzureCredential clase se tratan más adelante en este artículo de la sección Uso DefaultAzureCredential en una aplicación.

Ventajas de la autenticación basadas en token

Se recomienda encarecidamente la autenticación basada en tokens sobre el uso de cadenas de conexión al compilar aplicaciones para Azure. La autenticación basada en tokens ofrece las siguientes ventajas sobre la autenticación con cadenas de conexión.

  • Los métodos de autenticación basados en tokens descritos a continuación le permiten establecer los permisos específicos necesarios para la aplicación en el recurso de Azure. Este enfoque sigue el principio de privilegios mínimos. Por el contrario, una cadena de conexión concede derechos completos al recurso de Azure.
  • Mientras que cualquiera o cualquier aplicación con una cadena de conexión puede conectarse a un recurso de Azure, los métodos de autenticación basados en tokens limitan el acceso al recurso solo a las aplicaciones diseñadas para acceder al recurso.
  • En el caso de una identidad administrada, no hay ningún secreto de aplicación que almacenar. Esto hace que la aplicación sea más segura porque no hay ninguna cadena de conexión o secreto de aplicación que se pueda poner en peligro.
  • El paquete Azure.Identity del SDK de Azure administra los tokens automáticamente en segundo plano. Esto hace que el uso de la autenticación basada en tokens sea tan fácil de usar como una cadena de conexión.

El uso de cadenas de conexión debe limitarse a la prueba inicial de aplicaciones de concepto o prototipos de desarrollo que no tienen acceso a datos confidenciales o de producción. De lo contrario, siempre se deben preferir las clases de autenticación basadas en tokens disponibles en el SDK de Azure al autenticarse en los recursos de Azure.

Autenticación en entornos de servidor

Al hospedar en un entorno de servidor, a cada aplicación se le debe asignar una identidad de aplicación única por entorno en el que se ejecuta la aplicación. En Azure, una identidad de aplicación se representa mediante una entidad de servicio, un tipo especial de entidad de seguridad destinada a identificar y autenticar aplicaciones en Azure. El tipo de entidad de servicio que se va a usar para la aplicación depende de dónde se esté ejecutando la aplicación.

Método de autenticación Descripción
Aplicaciones hospedadas en Azure Las aplicaciones hospedadas en Azure deben usar una entidad de servicio de identidad administrada. Las identidades administradas están diseñadas para representar la identidad de una aplicación hospedada en Azure y solo se pueden usar con aplicaciones hospedadas en Azure.

Por ejemplo, una aplicación web de .NET hospedada en Azure App Service se asignaría a una identidad administrada. La identidad administrada asignada a la aplicación se usaría para autenticar la aplicación en otros servicios de Azure.

Aplicaciones hospedadas fuera de Azure
(por ejemplo, aplicaciones locales)
Las aplicaciones hospedadas fuera de Azure (por ejemplo, aplicaciones locales) que necesitan conectarse a los servicios de Azure deben usar una entidad de servicio de aplicación. Una entidad de servicio de aplicación representa la identidad de la aplicación en Azure y se crea a través del proceso de registro de la aplicación.

Por ejemplo, considera una aplicación web de .NET hospedada en el entorno local que use Azure Blob Storage. Crearía una entidad de servicio de aplicación para la aplicación mediante el proceso de registro de aplicaciones. Los AZURE_CLIENT_ID, AZURE_TENANT_IDy AZURE_CLIENT_SECRET se almacenarán como variables de entorno que leerá la aplicación en tiempo de ejecución y permitirán que la aplicación se autentique en Azure mediante la entidad de servicio de la aplicación.

Autenticación durante el desarrollo local

Cuando se ejecuta una aplicación en la estación de trabajo de un desarrollador durante el desarrollo local, esta debe autenticarse en los servicios de Azure que usa. Las dos estrategias principales para autenticar aplicaciones en Azure durante el desarrollo local son:

Método de autenticación Descripción
Crear objetos de entidad de servicio de aplicación dedicados que se usarán durante el desarrollo local En este método, los objetos de entidad de servicio de la aplicación dedicada se configuran mediante el proceso de registro de aplicaciones para su uso durante el desarrollo local. A continuación, la identidad de la entidad de servicio se almacena como variables de entorno a las que va a acceder la aplicación cuando se ejecuta en el desarrollo local.

Este método permite asignar los permisos de recursos específicos necesarios para la aplicación a los objetos de entidad de servicio utilizados por los desarrolladores durante el desarrollo local. Esto garantiza que la aplicación solo tiene acceso a los recursos específicos que necesita y replica los permisos que tendrá la aplicación en producción.

El inconveniente de este enfoque es la necesidad de crear objetos de entidad de servicio independientes para cada desarrollador que funcione en una aplicación.

Autenticación de la aplicación en Azure mediante las credenciales del desarrollador durante el desarrollo local En este método, un desarrollador debe iniciar sesión en Azure desde Visual Studio, la extensión de Azure Tools para VS Code, la CLI de Azure o Azure PowerShell en su estación de trabajo local. A continuación, la aplicación puede acceder a las credenciales del desarrollador desde el almacén de credenciales y usar esas credenciales para acceder a los recursos de Azure desde la aplicación.

Este método tiene la ventaja de una configuración más sencilla, ya que un desarrollador solo necesita iniciar sesión en su cuenta de Azure desde Visual Studio, VS Code o la CLI de Azure. El inconveniente de este enfoque es que es probable que la cuenta del desarrollador tenga más permisos de los que necesita la aplicación. Por lo tanto, este enfoque no replica con precisión los permisos con los que se ejecutará la aplicación en producción.

Uso de DefaultAzureCredential en una aplicación

DefaultAzureCredential admite varios métodos de autenticación y determina el método de autenticación que se usa en tiempo de ejecución. De esta manera, la aplicación puede usar diferentes métodos de autenticación en distintos entornos sin implementar código específico del entorno.

El orden y las ubicaciones en las que DefaultAzureCredential busca las credenciales se encuentran en DefaultAzureCredential.

Para implementar DefaultAzureCredential, agrega primero Azure.Identity y, opcionalmente, los paquetes Microsoft.Extensions.Azure a la aplicación. Puedes realizar esta acción mediante la línea de comandos o el Administrador de paquetes de NuGet.

Abre el entorno de terminal que prefieras en el directorio del proyecto de aplicación y escribe el comando siguiente.

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure

Por lo general, se accede a los servicios de Azure mediante las clases de cliente correspondientes desde el SDK. Estas clases y sus propios servicios personalizados deben registrarse en el archivo Program.cs para que se pueda acceder a ellas a través de la inserción de dependencias en toda la aplicación. Dentro de Program.cs, sigue los pasos que se indican a continuación para configurar correctamente el servicio y DefaultAzureCredential.

  1. Incluye los espacio de nombres Azure.Identity y Microsoft.Extensions.Azure con una instrucción using.
  2. Registra el servicio de Azure mediante los métodos auxiliares pertinentes.
  3. Pasa una instancia del objeto DefaultAzureCredential al método UseCredential.

En el segmento de código siguiente se muestra un ejemplo de esto.

using Microsoft.Extensions.Azure;
using Azure.Identity;

// Inside of Program.cs
builder.Services.AddAzureClients(x =>
{
    x.AddBlobServiceClient(new Uri("https://<account-name>.blob.core.windows.net"));
    x.UseCredential(new DefaultAzureCredential());
});

Como alternativa, también puede usar DefaultAzureCredential en los servicios de manera más directa sin la ayuda de los métodos de registro de Azure adicionales, tal como se muestra a continuación.

using Azure.Identity;

// Inside of Program.cs
builder.Services.AddSingleton<BlobServiceClient>(x => 
    new BlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"),
        new DefaultAzureCredential()));

Cuando el código anterior se ejecuta en tu estación de trabajo local durante el desarrollo local, buscará una entidad de servicio de aplicación en las variables de entorno o en Visual Studio, VS Code, la CLI de Azure o Azure PowerShell para un conjunto de credenciales de desarrollador. Cualquiera de estas pueden usarse para autenticar la aplicación en los recursos de Azure durante el desarrollo local.

Cuando se implementa en Azure, este mismo código también puede autenticar tu aplicación en otros recursos de Azure. DefaultAzureCredential puede recuperar la configuración del entorno y las configuraciones de identidad administrada para autenticarse en otros servicios automáticamente.

Exploración de la secuencia de métodos de autenticación DefaultAzureCredential

Internamente, DefaultAzureCredential implementa una cadena de proveedores de credenciales para autenticar aplicaciones en recursos de Azure. Cada proveedor de credenciales puede detectar si las credenciales de ese tipo están configuradas para la aplicación. DefaultAzureCredential comprueba secuencialmente cada proveedor en orden y usa las credenciales del primer proveedor que tiene las credenciales configuradas.

El orden y las ubicaciones en las que DefaultAzureCredential busca las credenciales se encuentran en DefaultAzureCredential.

Tipo de credencial Descripción
Entidad de servicio de la aplicación DefaultAzureCredential lee un conjunto de variables de entorno para determinar si se ha establecido una entidad de servicio de aplicación (usuario de aplicación) 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.
Identidad administrada Si la aplicación se implementa en un host de Azure con la identidad administrada habilitada, DefaultAzureCredential autenticará la aplicación con esa identidad administrada de Azure. La autenticación mediante una identidad administrada se describe en la sección Autenticación en entornos de servidor de este documento.

Este método solo está disponible cuando una aplicación se hospeda en Azure mediante un servicio como Azure App Service, Azure Functions o Azure Virtual Machines.
Visual Studio Si el desarrollador se ha autenticado en Azure iniciando sesión en Visual Studio, DefaultAzureCredential autenticará la aplicación en Azure con esa misma cuenta.
Visual Studio Code Si el desarrollador se ha autenticado en Azure mediante el complemento de Visual Studio Code cuenta de Azure, DefaultAzureCredential autenticará la aplicación en Azure con esa misma cuenta.
Azure CLI Si un desarrollador se ha autenticado en Azure mediante el comando de la az login CLI de Azure, DefaultAzureCredential autenticará la aplicación en Azure con esa misma cuenta.
Azure PowerShell Si un desarrollador se ha autenticado en Azure mediante el Connect-AzAccount cmdlet de Azure PowerShell, DefaultAzureCredential autenticará la aplicación en Azure con esa misma cuenta.
Interactive Si está habilitada, DefaultAzureCredential autenticará interactivamente al desarrollador a través del explorador predeterminado del sistema actual. Esta opción está deshabilitada de forma predeterminada.