Autenticación en recursos de Azure desde aplicaciones .NET hospedadas en el entorno local
Artículo
Las aplicaciones hospedadas fuera de Azure (por ejemplo, locales o en un centro de datos de terceros) deben usar una entidad de servicio de aplicación para autenticarse en Azure al acceder a los recursos de Azure. Los objetos de entidad de servicio de aplicación se crean mediante el proceso de registro de aplicaciones en Azure. Cuando se crea una entidad de servicio de aplicación, se generará un id. de cliente y un secreto de cliente para la aplicación. A continuación, el id. de cliente, el secreto de cliente y el id. de inquilino se almacenan en variables de entorno para que el SDK de Azure para .NET pueda autenticar la aplicación en Azure en tiempo de ejecución.
Debe crear un registro de aplicación diferente para cada entorno en el que se hospeda la aplicación. Esto permite configurar permisos de recursos específicos del entorno para cada entidad de servicio y asegurarse de que una aplicación implementada en un entorno no se comunica con los recursos de Azure que forman parte de otro entorno.
1: Registro de la aplicación en Azure AD
Una aplicación se puede registrar en Azure mediante Azure Portal o la CLI de Azure.
Inicie sesión en Azure Portal y siga los pasos siguientes.
Instrucciones
Instantánea
En el Portal de Azure:
Escriba registros de aplicación en la barra de búsqueda de la parte superior de Azure Portal.
Seleccione el elemento con la etiqueta Registros de aplicaciones bajo el encabezado Servicios, en el menú que aparece bajo la barra de búsqueda.
En la página Registros de aplicaciones, seleccione + Nuevo registro.
En la página Registrar una aplicación, rellene el formulario como se indica a continuación.
Nombre → Escriba un nombre para el registro de la aplicación en Azure. Se recomienda que este nombre incluya el nombre de la aplicación y el entorno (prueba, producción) para el que se realiza el registro de la aplicación.
Tipos de cuenta admitidos → Solo las cuentas de este directorio organizativo.
Seleccione Registrar para registrar la aplicación y crear la entidad de servicio de la aplicación.
En la página Registro de aplicaciones de la aplicación:
Id. de aplicación (cliente) → Id. de aplicación que la aplicación usará para acceder a Azure durante el desarrollo local. Copie este valor en una ubicación temporal en un editor de texto, ya que lo necesitará en un paso futuro.
Id. de directorio (inquilino) → La aplicación también necesitará este valor cuando se autentique en Azure. Copie este valor en una ubicación temporal en un editor de texto, ya que también lo necesitará en un paso futuro.
Credenciales de cliente → Debe establecer las credenciales de cliente para la aplicación antes de que la aplicación pueda autenticarse en Azure y usar los servicios de Azure. Seleccione Agregar un certificado o un secreto para agregar credenciales para la aplicación.
En la página Certificados y secretos, seleccione + Nuevo secreto de cliente.
Aparecerá el cuadro de diálogo Agregar un secreto de cliente desde el lado derecho de la página. En este cuadro de diálogo:
Descripción → Escriba un valor de Actual.
Expira → Seleccione un valor de 24 meses.
Seleccione Agregar para agregar el secreto.
IMPORTANTE: Establezca un aviso en el calendario antes de la fecha de expiración del secreto. De este modo, puede agregar un nuevo secreto antes y actualizar las aplicaciones antes de la expiración de este secreto y evitar una interrupción del servicio en la aplicación.
En la página Certificados y secretos, se mostrará el valor del secreto de cliente.
Copie este valor en una ubicación temporal en un editor de texto, ya que lo necesitará en un paso futuro.
IMPORTANTE: Esta es la única vez que verá este valor. Una vez que abandone o actualice esta página, no podrá volver a ver este valor. Puede agregar un secreto de cliente adicional sin invalidar este secreto de cliente, pero no volverá a ver este valor.
az ad sp create-for-rbac --name <app-name>
El resultado de este comando será similar al siguiente: Anote estos valores o mantenga abierta esta ventana, ya que necesitará estos valores en el paso siguiente y no podrá volver a ver el valor de contraseña (secreto de cliente).
2: Asignación de roles a la entidad de servicio de la aplicación
A continuación, debe determinar qué roles (permisos) necesita la aplicación y en qué recursos y asignar dichos roles a la aplicación. Los roles se pueden asignar a un rol en el ámbito de recurso, grupo de recursos o suscripción. En este ejemplo se muestra cómo asignar roles a la entidad de servicio en el ámbito del grupo de recursos, ya que la mayoría de las aplicaciones agrupan todos sus recursos de Azure en un único grupo de recursos.
Busque el grupo de recursos de la aplicación; para ello, busque el nombre del grupo de recursos mediante el cuadro de búsqueda situado en la parte superior de Azure Portal.
Vaya al grupo de recursos. Para ello, seleccione el nombre del grupo de recursos en el encabezado Grupos de recursos del cuadro de diálogo.
En la página del grupo de recursos, seleccione Control de acceso (IAM) en el menú izquierdo.
En la página Control de acceso (IAM):
Seleccione la pestaña Asignaciones de roles.
Seleccione + Agregar en el menú superior y, a continuación, Agregar asignación de roles en el menú desplegable resultante.
La página Agregar asignación de roles muestra todos los roles que se pueden asignar para el grupo de recursos.
Use el cuadro de búsqueda para filtrar la lista a un tamaño más fácil de administrar. En este ejemplo se muestra cómo filtrar los roles de Storage Blob.
Seleccione el rol que quiere asignar.
Seleccione Siguiente para ir a la pantalla siguiente.
La siguiente página Agregar asignación de roles permite especificar a qué usuario se debe asignar el rol.
Seleccione Usuario, grupo o entidad de servicio en Asignar acceso a.
Seleccione + Seleccionar miembros en Miembros.
Se abrirá un cuadro de diálogo en el lado derecho de Azure Portal.
En el cuadro de diálogo Seleccionar miembros:
El cuadro de texto Seleccionar se puede usar para filtrar la lista de usuarios y grupos de la suscripción. Si es necesario, escriba los primeros caracteres de la entidad de servicio que creó para que la aplicación filtre la lista.
Seleccione la entidad de servicio asociada a la aplicación.
Seleccione Seleccionar en la parte inferior del cuadro de diálogo para continuar.
La entidad de servicio se mostrará ahora como seleccionada en la pantalla Agregar asignación de roles.
Seleccione Revisar y asignar para ir a la página final y, a continuación, Revisar y asignar de nuevo para completar el proceso.
az role assignment create --assignee "{appId}" \
--role "{roleName}" \
--resource-group "{resourceGroupName}"
Para obtener los nombres de roles a los que se puede asignar una entidad de servicio, use el comando az role definition list.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Por ejemplo, para permitir que la entidad de servicio con el appId de 00000000-0000-0000-0000-000000000000 tenga acceso de lectura, escritura y eliminación en datos y contenedores de blobs de Azure Storage en todas las cuentas de almacenamiento del grupo de recursos msdocs-dotnet-sdk-auth-example, debe asignar la entidad de servicio de la aplicación al rol Colaborador de datos de Storage Blob mediante el comando siguiente.
az role assignment create --assignee "00000000-0000-0000-0000-000000000000" \
--role "Storage Blob Data Contributor" \
--resource-group "msdocs-dotnet-sdk-auth-example"
3: Configuración de variables de entorno para la aplicación
El objeto DefaultAzureCredential buscará las credenciales de la entidad de servicio en un conjunto de variables de entorno en tiempo de ejecución. Hay varias maneras de configurar variables de entorno al trabajar con .NET en función de las herramientas y el entorno.
Independientemente del enfoque que elija, deberá configurar las siguientes variables de entorno al trabajar con una entidad de servicio.
AZURE_CLIENT_ID → Valor del id. de la aplicación.
AZURE_TENANT_ID → Valor del id. de inquilino.
AZURE_CLIENT_SECRET → Contraseña o credencial generada para la aplicación.
Si la aplicación está hospedada en IIS, se recomienda establecer variables de entorno por grupo de aplicaciones para aislar la configuración entre las aplicaciones.
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_ID',value='00000000-0000-0000-0000-000000000000']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_TENANT_ID',value='11111111-1111-1111-1111-111111111111']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_SECRET',value='=abcdefghijklmnopqrstuvwxyz']" /commit:apphost
También puede configurar estas opciones directamente mediante el elemento applicationPools en el archivo applicationHost.config.
Puede establecer variables de entorno para Windows desde la línea de comandos. Sin embargo, al usar este enfoque, los valores son accesibles para todas las aplicaciones que se ejecutan en ese sistema operativo y pueden causar conflictos si no tiene cuidado. Las variables de entorno se pueden establecer en el nivel de usuario o del sistema.
# Set user environment variables
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000"
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111"
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz"
# Set system environment variables - requires running as admin
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000" /m
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111" /m
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz" /m
También puede usar PowerShell para establecer variables de entorno en el nivel de usuario o máquina.
# Set user environment variables
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "User")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "User")
# Set system environment variables - requires running as admin
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "Machine")
4: Implementación de DefaultAzureCredential en su 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.
Haz clic con el botón derecho en el nodo del proyecto en Visual Studio y selecciona Administrar paquetes NuGet. Busca Azure.Identity en el campo de búsqueda e instale el paquete coincidente. Repite este proceso también para el paquete 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.
Incluye los espacio de nombres Azure.Identity y Microsoft.Extensions.Azure con una instrucción using.
Registra el servicio de Azure mediante los métodos auxiliares pertinentes.
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.
Colaborar con nosotros en GitHub
El origen de este contenido se puede encontrar en GitHub, donde también puede crear y revisar problemas y solicitudes de incorporación de cambios. Para más información, consulte nuestra guía para colaboradores.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea: https://aka.ms/ContentUserFeedback.