Autenticación de aplicaciones NET en servicios de Azure durante el desarrollo local mediante entidades de servicio

Al crear aplicaciones en la nube, los desarrolladores necesitan depurar y probar aplicaciones en su estación de trabajo 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. 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.

A diagram showing how a .NET app during local development will use the developer's credentials to connect to Azure by obtaining those credentials locally installed development tools.

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 registros de aplicaciones independientes por cada 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. El SDK de Azure para NET 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:
  1. Escriba registros de aplicación en la barra de búsqueda de la parte superior de Azure Portal.
  2. Seleccione el elemento con la etiqueta Registros de aplicaciones en el encabezado Servicios, en el menú que aparece bajo la barra de búsqueda.
A screenshot showing how to use the top search bar in the Azure portal to find and navigate to the App registrations page.
En la página Registros de aplicaciones, seleccione + Nuevo registro. A screenshot showing the location of the New registration button in the App registrations page.
En la página Registrar una aplicación, rellene el formulario como se indica a continuación.
  1. 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.
  2. Tipos de cuenta admitidosSolo las cuentas de este directorio organizativo.
Seleccione Registrar para registrar la aplicación y crear la entidad de servicio de la aplicación.
A screenshot showing how to fill out the Register an application page by giving the app a name and specifying supported account types as accounts in this organizational directory only.
En la página Registro de aplicaciones de la aplicación:
  1. 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.
  2. 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.
  3. 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.
A screenshot of the App registration page after the app registration has been completed. This screenshot shows the location of the application ID and tenant ID, which will be needed in a future step. It also shows the location of the link to use to add an application secret for the app.
En la página Certificados y secretos, seleccione + Nuevo secreto de cliente. A screenshot showing the location of the link to use to create a new client secret on the certificates and secrets page.
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:
  1. Descripción → Escriba un valor de Actual.
  2. Expira → Seleccione un valor de 24 meses.
Seleccione Agregar para agregar el secreto.
A screenshot showing the page where a new client secret is added for the application service principal create by the app registration process.
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.
A screenshot showing the page with the generated client secret.

2: Creación de un grupo de seguridad de Azure AD para el desarrollo local

Dado que normalmente hay varios desarrolladores que trabajan en una aplicación, se recomienda crear un grupo de Azure AD 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. Esto ofrece las ventajas que se indican a continuación.

  • 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 de Azure AD 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.
Instrucciones Instantánea
Vaya a la página de Azure Active Directory en Azure Portal. Para ello, escriba Azure Active Directory en el cuadro de búsqueda de la parte superior de la página y, a continuación, seleccione Azure Active Directory en los servicios. A screenshot showing how to use the top search bar in the Azure portal to search for and navigate to the Azure Active Directory page.
En la página Azure Active Directory, seleccione Grupos en el menú de la izquierda. A screenshot showing the location of the Groups menu item in the left-hand menu of the Azure Active Directory Default Directory page.
En la página Todos los grupos, seleccione Nuevo grupo. A screenshot showing the location of the New Group button in the All groups page.
En la página Nuevo grupo:
  1. Tipo de grupo: Seguridad
  2. 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.
  3. Descripción del grupo → Descripción del propósito del grupo.
  4. Seleccione el vínculo Sin miembros seleccionados en Miembros para agregar miembros al grupo.
A screenshot showing how to fill out the form to create a new Azure Active Directory group for the application. This screenshot also shows the location of the link to select to add members to this group.
En el cuadro de diálogo Agregar miembros:
  1. Use el cuadro de búsqueda para filtrar la lista de entidades de seguridad en la lista.
  2. 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.
  3. Cuando haya terminado, pulse el botón Seleccionar.
A screenshot of the Add members dialog box showing how to select application service principals to be included in the group.
De nuevo en la página Nuevo grupo, seleccione Crear para crear el grupo.

El grupo se creará y volverá a la página Todos los grupos. El grupo puede tardar hasta 30 segundos en aparecer y es posible que tenga que actualizar la página debido al almacenamiento en caché en Azure Portal.
A screenshot of the New Group page showing how to complete the process by selecting the Create button.

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 Azure Active Directory que se creó en el paso 2. 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 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.

Instrucciones Instantánea
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.
A screenshot showing how to use the top search box in the Azure portal to locate and navigate to the resource group you want to assign roles (permissions) to.
En la página del grupo de recursos, seleccione Control de acceso (IAM) en el menú izquierdo. A screenshot of the resource group page showing the location of the Access control (IAM) menu item.
En la página Control de acceso (IAM):
  1. Seleccione la pestaña Asignaciones de roles.
  2. Seleccione + Agregar en el menú superior y, a continuación, Agregar asignación de roles en el menú desplegable resultante.
A screenshot showing how to navigate to the role assignments tab and the location of the button used to add role assignments to a resource group.
La página Agregar asignación de roles muestra todos los roles que se pueden asignar para el grupo de recursos.
  1. 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.
  2. Seleccione el rol que quiere asignar.
Seleccione Siguiente para ir a la pantalla siguiente.
A screenshot showing how to filter and select role assignments to be added to the resource group.
La siguiente página Agregar asignación de roles permite especificar a qué usuario se debe asignar el rol.
  1. Seleccione Usuario, grupo o entidad de servicio en Asignar acceso a.
  2. Seleccione + Seleccionar miembros en Miembros.
Se abrirá un cuadro de diálogo en el lado derecho de Azure Portal.
A screenshot showing the radio button to select to assign a role to an Azure AD group and the link used to select the group to assign the role to.
En el cuadro de diálogo Seleccionar miembros:
  1. 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 Azure AD que creó para la aplicación.
  2. Seleccione el grupo de desarrollo local de Azure AD asociado a la aplicación.
Pulse Seleccionar en la parte inferior del cuadro de diálogo para continuar.
A screenshot showing how to filter for and select the Azure AD group for the application in the Select members dialog box.
El grupo de Azure AD 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.
A screenshot showing the completed Add role assignment page and the location of the Review + assign button used to complete the process.

4: Establecimiento de variables de entorno de aplicación

El objeto DefaultAzureCredential buscará información sobre 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.

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 inicie la aplicación, estos valores se tomarán automáticamente. Tenga en cuenta que estas configuraciones no viajan con la aplicación con la implementación, por lo que deberá configurar variables de entorno en el entorno de hospedaje de destino.

"profiles": {
    "SampleProject": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7177;http://localhost:5177",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID":"11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID": "11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    }
  }

5: Implementación de DefaultAzureCredential en la 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.