Tutorial: Uso de una identidad administrada para conectar Key Vault a una aplicación web de Azure en .NET

Azure Key Vault proporciona una manera de almacenar credenciales y otros secretos con mayor seguridad. Pero el código debe autenticarse en Key Vault para recuperarlos. Las identidades administradas para Azure recursos resuelven este problema al proporcionar a los servicios de Azure una identidad administrada automáticamente en Microsoft Entra ID. El código usa esta identidad para autenticarse en cualquier servicio que admita la autenticación Microsoft Entra, incluida la Key Vault, sin insertar credenciales en el código.

En este tutorial, creará e implementará una aplicación web de Azure en Azure App Service y, a continuación, usará una identidad administrada para autenticar la aplicación en un almacén de claves mediante la biblioteca cliente secreta de Azure Key Vault para .NET y el CLI de Azure. Se aplican los mismos principios si usa otro idioma, Azure PowerShell o el portal de Azure.

Para más información sobre las aplicaciones web y la implementación de App Service, consulte:

Prerrequisitos

Para completar este tutorial, necesita lo siguiente:

Si ya tiene una aplicación web implementada en Azure App Service, vaya a Configurar la aplicación web para conectarse a Key Vault y Modificar la aplicación para acceder a la key vault.

Creación de una aplicación .NET Core

En este paso, configure el proyecto de .NET local.

En una ventana de terminal, cree un directorio denominado akvwebapp y cambie a él:

mkdir akvwebapp
cd akvwebapp

Cree una aplicación web de .NET mediante el comando web dotnet new:

dotnet new web

Ejecute la aplicación localmente para ver cómo se ve antes de implementarla en Azure:

dotnet run

En un explorador web, abra la aplicación en http://localhost:5000. Verá el mensaje "Hola mundo!" de la aplicación de ejemplo.

Para obtener más información sobre cómo crear aplicaciones web, consulte Creación de una aplicación web de ASP.NET Core en Azure App Service.

Implementación de la aplicación en Azure

En este paso, implemente la aplicación .NET en Azure App Service mediante la implementación zip. La implementación mediante ZIP es el mecanismo de implementación basado en paquetes recomendado para App Service. Para la entrega continua desde el control de código fuente, use Acciones de GitHub o Azure DevOps Pipelines en su lugar.

Creación de un grupo de recursos

Cree un grupo de recursos que contenga el almacén de claves y la aplicación web con az group create:

az group create --name "<resource-group>" --location "EastUS"

Creación de un plan de App Service

Cree un plan de App Service mediante az appservice plan create. En el ejemplo siguiente se crea un plan denominado myAppServicePlan en el nivel gratis (FREE):

az appservice plan create --name myAppServicePlan --resource-group <resource-group> --sku FREE

Creación de una aplicación web

Cree una aplicación web de Azure en el plan myAppServicePlan.

Importante

Al igual que un almacén de claves, una aplicación web Azure debe tener un nombre único global. Reemplace por <webapp-name> el nombre de la aplicación web.

az webapp create --resource-group "<resource-group>" --plan "myAppServicePlan" --name "<webapp-name>"

Vaya a la nueva aplicación para confirmar que se está ejecutando:

https://<webapp-name>.azurewebsites.net

Verá la página predeterminada para una nueva aplicación web Azure.

Implemente su aplicación local con despliegue ZIP

En el directorio del akvwebapp proyecto, compile el proyecto y cree un archivo ZIP de implementación:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..

Sugerencia

En Windows sin zip, use PowerShell: Compress-Archive -Path .\publish\* -DestinationPath .\akvwebapp.zip.

Implemente el archivo ZIP en la aplicación web mediante az webapp deploy:

az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

Actualice la aplicación implementada en el explorador web:

https://<webapp-name>.azurewebsites.net

Verá el mismo mensaje "Hola mundo!" que vio en http://localhost:5000.

Configuración de la aplicación web para conectarse a Key Vault

En esta sección, habilitarás la aplicación web para que acceda a Key Vault y actualizarás el código de tu aplicación para recuperar un secreto.

Creación y asignación de acceso a una identidad administrada

Use una identidad administrada para autenticar la aplicación web en Key Vault. Una identidad administrada elimina la necesidad de administrar las credenciales en el código.

Cree la identidad de la aplicación mediante az webapp identity assign:

az webapp identity assign --name "<webapp-name>" --resource-group "<resource-group>"

El comando devuelve un fragmento de código JSON similar al siguiente:

{
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "SystemAssigned"
}

Para obtener permisos para la bóveda de claves a través del Control de Acceso Basado en Roles (RBAC), asigne un rol a su "Nombre Principal de Usuario" (UPN) utilizando el comando de CLI de Azure az role assignment create.

az role assignment create --role "Key Vault Secrets User" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.KeyVault/vaults/<vault-name>"

Reemplace <upn>, <subscription-id> y <vault-name> con sus valores reales. Si usó otro nombre de grupo de recursos, reemplace también "myResourceGroup". El UPN normalmente tendrá el formato de una dirección de correo electrónico (por ejemplo, username@domain.com).

Modificación de la aplicación para acceder al almacén de claves

En este tutorial se usa la biblioteca cliente secreta de Azure Key Vault. También puede usar la biblioteca cliente de certificados Azure Key Vault o la biblioteca cliente de claves de Azure Key Vault.

Instalación de los paquetes

En la ventana del terminal, instale la biblioteca cliente secreta de Azure Key Vault y la biblioteca cliente de Azure Identity:

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets

Actualización del código

Abra Program.cs en su proyecto akvwebapp.

Agregue estas using directivas en la parte superior del archivo:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

Añade las siguientes líneas antes de la llamada app.MapGet, actualizando <vault-name> con el nombre de tu Key Vault. Este código usa DefaultAzureCredential para autenticarse en Key Vault a través de la identidad administrada de la aplicación web. Para obtener más información, consulte la guía del desarrollador. El código también configura un retroceso exponencial para los reintentos en caso de que Key Vault esté limitado. Para obtener más información sobre los límites de transacción, consulte las directrices sobre limitación de Azure Key Vault.

SecretClientOptions options = new SecretClientOptions()
    {
        Retry =
        {
            Delay= TimeSpan.FromSeconds(2),
            MaxDelay = TimeSpan.FromSeconds(16),
            MaxRetries = 5,
            Mode = RetryMode.Exponential
         }
    };
var client = new SecretClient(new Uri("https://<vault-name>.vault.azure.net/"), new DefaultAzureCredential(), options);

KeyVaultSecret secret = client.GetSecret("<secret-name>");

string secretValue = secret.Value;

Actualice la línea app.MapGet("/", () => "Hola mundo!"); a:

app.MapGet("/", () => secretValue);

Guarde los cambios.

Nueva implementación de la aplicación web

Recompile el paquete de implementación y vuelva a implementar:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..
az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

Ir a la aplicación web completada

https://<webapp-name>.azurewebsites.net

Donde antes veía «Hola mundo!», ahora ve el valor de su secreto.

Pasos siguientes