Autenticación de aplicaciones NET en servicios de Azure durante el desarrollo local mediante entidades de servicio
Artículo
Los desarrolladores deben depurar y probar aplicaciones en la nube en sus estaciones de trabajo locales. 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. En este artículo se explica cómo configurar objetos de entidad de servicio de aplicación dedicados que se usarán durante el desarrollo local.
Las entidades de servicio de aplicaciones dedicadas para el desarrollo local permiten seguir el principio de privilegios mínimos durante el desarrollo de aplicaciones. Dado que los permisos tienen como ámbito exactamente lo que se necesita para la aplicación durante el desarrollo, se impide que el código de la aplicación acceda accidentalmente a un recurso de Azure destinado al uso por otra aplicación. Esto también impide que se produzcan errores cuando la aplicación se mueve al entorno de producción debido a un exceso de privilegios de la aplicación en el entorno de desarrollo.
Cuando la aplicación se registra en Azure, se configura una entidad de servicio de aplicación. Al registrar aplicaciones para el desarrollo local, se recomienda lo siguiente:
Crear registros de aplicaciones independientes para cada desarrollador que trabaje en la aplicación. Esto creará entidades de servicio de aplicación independientes para que las puedan usar cada desarrollador durante el desarrollo local y evitará la necesidad de que los desarrolladores compartan credenciales para una única entidad de servicio de aplicación.
Crear un registro de aplicación independiente por aplicación. Esto limita los permisos de la aplicación solo a lo que necesita la aplicación.
Durante el desarrollo local, las variables de entorno se establecen con la identidad de la entidad de servicio de la aplicación. La biblioteca de identidades de Azure lee estas variables de entorno y usa esta información para autenticar la aplicación en los recursos de Azure que necesita.
1: Registro de la aplicación en Azure
Los objetos de la entidad de servicio de la aplicación se crean con un registro de aplicación en Azure. Esto puede hacerse 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 en 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, el usuario para el que se realizará el registro de la aplicación y un identificador, como, por ejemplo, "dev", para indicar que este registro de aplicación es para su uso en el desarrollo local.
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.
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 deje 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.
En primer lugar, use el comando az ad sp create-for-rbac para crear una nueva entidad de servicio para la aplicación. Esto también creará el registro de la aplicación para la aplicación al mismo tiempo.
az ad sp create-for-rbac \
--name {service-principal-name}
La salida de este comando es similar al siguiente valor JSON:
Copie esta salida en un archivo temporal en un editor de texto, ya que necesitará estos valores en un paso futuro. Este es el único lugar en el que ve el secreto de cliente (contraseña) para la entidad de servicio. Sin embargo, puede agregar una nueva contraseña más adelante sin invalidar la entidad de servicio ni las contraseñas existentes.
2: Creación de un grupo de Microsoft Entra para el desarrollo local
Dado que normalmente hay varios desarrolladores que trabajan en una aplicación, se recomienda crear un grupo de Microsoft Entra para encapsular los roles (permisos) que la aplicación necesita en el desarrollo local en lugar de asignar los roles a objetos de entidad de servicio individuales. Este procedimiento ofrece las siguientes ventajas:
Todos los desarrolladores están seguros de tener asignados los mismos roles, ya que los roles se asignan en el nivel de grupo.
Si se necesita un nuevo rol para la aplicación, solo debe agregarse al grupo para la aplicación.
Si un nuevo desarrollador se une al equipo, se crea una nueva entidad de servicio de aplicación para el desarrollador y esta se agrega al grupo, lo que garantiza que el desarrollador tiene los permisos adecuados para trabajar en la aplicación.
Vaya a la página Microsoft Entra ID en Azure Portal; para ello, escriba Microsoft Entra ID en el cuadro de búsqueda de la parte superior de la página. Seleccione Microsoft Entra ID en la sección Servicios.
En la página Microsoft Entra ID, seleccione Grupos en el menú de la izquierda.
En la página Todos los grupos, seleccione Nuevo grupo.
En la página Nuevo grupo:
Tipo de grupo: Seguridad
Nombre de grupo → Nombre del grupo de seguridad, que normalmente se crea a partir del nombre de la aplicación. También resulta útil incluir una cadena como local-dev en el nombre del grupo para indicar el propósito del grupo.
Descripción del grupo → Descripción del propósito del grupo.
Seleccione el vínculo Sin miembros seleccionados en Miembros para agregar miembros al grupo.
En el cuadro de diálogo Agregar miembros:
Use el cuadro de búsqueda para filtrar la lista de entidades de seguridad en la lista.
Seleccione las entidades de servicio de la aplicación para el desarrollo local de esta aplicación. A medida que se seleccionan los objetos, se atenuarán y se moverán a la lista Elementos seleccionados de la parte inferior del cuadro de diálogo.
Cuando haya terminado, pulse el botón Seleccionar.
De nuevo en la página Nuevo grupo, seleccione Crear para crear el grupo.
El grupo se creará y se le redirigirá a la página Todos los grupos. El grupo puede tardar hasta 30 segundos en aparecer. Es posible que tenga que actualizar la página debido al almacenamiento en caché en Azure Portal.
El comando az ad group create se usa para crear grupos en Microsoft Entra ID. Los parámetros --display-name y --mail-nickname son obligatorios. El nombre proporcionado al grupo debe basarse en el nombre de la aplicación. También resulta útil incluir una frase como "local-dev" en el nombre del grupo para indicar el propósito.
az ad group create \
--display-name MyDisplay \
--mail-nickname MyDisplay \
--description {group-description}
Para agregar miembros al grupo, necesitará el id. de objeto de la entidad de servicio de la aplicación, que es diferente al id. de la aplicación. Use el comando az ad sp list para enumerar las entidades de servicio disponibles. El comando de parámetro --filter acepta filtros de estilo de OData y se puede usar para filtrar la lista como se muestra. El parámetro --query limita las columnas solo a aquellas de interés.
az ad sp list \
--filter "startswith(displayName, 'msdocs')" \
--query "[].{objectId:objectId, displayName:displayName}" \
--output table
az ad group member add \
--group {group-name} \
--member-id {object-id}
3: Asignación de roles a la aplicación
A continuación, debe determinar qué roles (permisos) necesita la aplicación y en qué recursos para, a continuación, asignar dichos roles a la aplicación. En este ejemplo, los roles se asignarán al grupo de Microsoft Entra creado en el paso 2. Los grupos 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 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 del grupo de desarrollo local de Microsoft Entra que creó para la aplicación.
Seleccione el grupo de desarrollo local de Microsoft Entra asociado a la aplicación.
Seleccione Seleccionar en la parte inferior del cuadro de diálogo para continuar.
El grupo de Microsoft Entra se mostrará ahora como seleccionado 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.
Se asignará un rol a la entidad de servicio de la aplicación en Azure mediante el comando az role assignment create:
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 de la aplicación 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"
4: Establecimiento de variables de entorno de aplicación
En tiempo de ejecución, DefaultAzureCredential busca la información de la entidad de servicio en una colección de variables de entorno. 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.
Al trabajar localmente con Visual Studio, las variables de entorno se pueden establecer en el archivo launchsettings.json de la carpeta Properties de su proyecto. Cuando se inicia la aplicación, estos valores se extraen automáticamente. Tenga en cuenta que estas configuraciones no viajan con la aplicación cuando se implementa, por lo que debe configurar variables de entorno en el entorno de hospedaje de destino.
Al trabajar localmente con Visual Studio Code, las variables de entorno se pueden establecer en el archivo launch.json de su proyecto. Cuando se inicie la aplicación, estos valores se tomarán automáticamente. Tenga en cuenta que estas configuraciones no viajan con la aplicación cuando se implementa, por lo que debe configurar variables de entorno en el entorno de hospedaje de destino.
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 se 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")
5: Implementación de DefaultAzureCredential en la aplicación
DefaultAzureCredential es una secuencia ordenada de mecanismos para autenticarse en Microsoft Entra. Cada mecanismo de autenticación es una clase derivada de la clase TokenCredential y se conoce como una credencial. En tiempo de ejecución, DefaultAzureCredential intenta autenticarse con la primera credencial. Si esa credencial no puede adquirir un token de acceso, se intenta utilizar la siguiente credencial de la secuencia, y así sucesivamente hasta que se obtenga correctamente un token de acceso. De esta manera, la aplicación puede usar diferentes credenciales 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.
En Visual Studio, haga clic con el botón derecho en la ventana Explorador de soluciones y seleccione Administrar paquetes NuGet. Busque Azure.Identity e instale el paquete coincidente. Repita este proceso para el paquete Microsoft.Extensions.Azure.
Se accede a los servicios de Azure mediante clases de cliente especializadas de las distintas bibliotecas cliente del SDK de Azure. Estas clases y sus propios servicios personalizados deben registrarse para que se pueda acceder a ellas a través de la inserción de dependencias en toda la aplicación. En Program.cs, complete los pasos siguientes para registrar una clase de cliente y DefaultAzureCredential:
Incluya los espacios de nombres Azure.Identity y Microsoft.Extensions.Azure mediante las directivas using.
Registre el cliente de servicio de Azure mediante el método de extensión con el prefijo Add correspondiente.
Pase una instancia del objeto DefaultAzureCredential al método UseCredential.
Por ejemplo:
using Microsoft.Extensions.Azure;
using Azure.Identity;
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new DefaultAzureCredential());
});
Una alternativa a UseCredential consiste en crear instancias de DefaultAzureCredential directamente:
using Azure.Identity;
builder.Services.AddSingleton<BlobServiceClient>(_ =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new DefaultAzureCredential()));
Cuando el código anterior se ejecuta en la estación de trabajo de desarrollo local, busca en las variables de entorno de una entidad de servicio de aplicación o en las herramientas de desarrollo instaladas localmente, como Visual Studio, un conjunto de credenciales de desarrollador. Se puede usar cualquier enfoque 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.