Acceder a Azure Storage desde una aplicación web mediante identidades administradas
Aprenda a establecer el acceso a Azure Storage para una aplicación web (no para un usuario con la sesión iniciada) que se ejecuta en Azure App Service mediante identidades administradas.
Puede que desee agregar acceso al plano de datos de Azure (Azure Storage, Azure SQL Database, Azure Key Vault u otros servicios) desde la aplicación web. Podría usar una clave compartida, pero tendría que preocuparse de la seguridad operativa de quién puede crear, implementar y administrar el secreto. También es posible que la clave pudiera insertarse en GitHub, donde los hackers saben cómo buscar. Una manera más segura de dar acceso a los datos a la aplicación web es usar identidades administradas.
Una identidad administrada de Microsoft Entra ID permite a App Service acceder a los recursos a través del control de acceso basado en roles, sin necesidad de credenciales de aplicación. Después de asignar una identidad administrada a la aplicación web, Azure se encarga de la creación y distribución de un certificado. Los usuarios no tienen que preocuparse de administrar secretos ni credenciales de aplicaciones.
En este tutorial, aprenderá a:
- Crear una identidad administrada asignada por el sistema en una aplicación web.
- Crear una cuenta de almacenamiento y un contenedor de Azure Blob Storage.
- Acceder a Storage desde una aplicación web mediante identidades administradas.
Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.
Requisitos previos
- Una aplicación web que se ejecuta en Azure App Service que tiene el módulo de autenticación y autorización de App Service habilitado.
Habilitación de la identidad administrada en una aplicación
Si crea y publica la aplicación web mediante Visual Studio, habilitará la identidad administrada en la aplicación. En la instancia de App Service, seleccione Identidad en el panel izquierdo y, a continuación, Asignado por el sistema. Compruebe que el Estado está establecido en Activo. Si no es así, seleccione Guardar y, a continuación, Sí para habilitar la identidad administrada asignada por el sistema. Una vez habilitada la identidad administrada, el estado se establece en Activo y el identificador del objeto está disponible.
Este paso crea un nuevo identificador de objeto, diferente del identificador de la aplicación que se creó en el panel Autenticación o autorización. Copie el identificador de objeto de la identidad administrada asignada por el sistema. Lo necesitará más adelante.
Creación de una cuenta de almacenamiento y un contenedor de Blob Storage
Ahora ya está listo para crear una cuenta de almacenamiento y un contenedor de Blob Storage.
Cada cuenta de almacenamiento debe pertenecer a un grupo de recursos de Azure. Un grupo de recursos es un contenedor lógico para agrupar servicios de Azure. Al crear una cuenta de almacenamiento, puede elegir entre crear un grupo de recursos o usar uno existente. En este artículo se muestra cómo crear un nuevo grupo de recursos.
Una cuenta de almacenamiento de uso general v2 proporciona acceso a todos los servicios de Azure Storage: Blob, File, Queue, Table y Disk. Los pasos indicados aquí crean una cuenta de almacenamiento de uso general v2, pero los pasos para crear cualquier otro tipo de cuenta de almacenamiento son similares.
Los blobs de Azure Storage se organizan en contenedores. Antes de poder cargar un blob más adelante en este tutorial, primero debe crear un contenedor.
Para crear una cuenta de almacenamiento de uso general v2 en Azure Portal, siga estos pasos.
En el menú de Azure Portal, seleccione Todos los servicios. En la lista de recursos, escriba Cuentas de almacenamiento. Cuando comience a escribir, la lista se filtrará en función de la entrada. Seleccione Cuentas de almacenamiento.
En la ventana Cuentas de almacenamiento que aparece, seleccione Crear.
Seleccione la suscripción en la que se va a crear la cuenta de almacenamiento.
En el campo Grupo de recursos, seleccione en el menú desplegable el grupo de recursos que contiene la aplicación web.
Después, escriba un nombre para la cuenta de almacenamiento. El nombre que elija debe ser único en Azure. El nombre debe tener también una longitud de entre 3 y 24 caracteres y solo puede contener números y letras minúsculas.
Seleccione una ubicación para la cuenta de almacenamiento o utilice la ubicación predeterminada.
En Rendimiento, seleccione la opción Estándar.
En Redundancia, seleccione la opción Almacenamiento con redundancia local (LRS) en la lista desplegable.
Seleccione Revisar para revisar la configuración de la cuenta de almacenamiento y crear la cuenta.
Seleccione Crear.
Para crear un contenedor de Blob Storage en Azure Storage, siga estos pasos.
Vaya a la nueva cuenta de almacenamiento en Azure Portal.
En el menú izquierdo de la cuenta de almacenamiento, desplácese a la sección Almacenamiento de datos y, después, seleccione Contenedores.
Seleccione el botón + Contenedor.
Escriba un nombre para el nuevo contenedor. El nombre del contenedor debe escribirse en minúsculas, comenzar por una letra o un número, y solo puede incluir letras, números y el carácter de guión (-).
Establezca el nivel de acceso público al contenedor. El nivel predeterminado es Private (no anonymous access) [Privado (sin acceso anónimo)].
Seleccione Crear para crear el contenedor.
Concesión de acceso a la cuenta de almacenamiento
Debe conceder a la aplicación web acceso a la cuenta de almacenamiento antes de poder crear, leer o eliminar blobs. En un paso anterior, configuró la aplicación web que se ejecuta en App Service con una identidad administrada. Con el control de acceso basado en roles de Azure puede conceder a la identidad administrada acceso a otro recurso, igual que cualquier entidad de seguridad. El rol Colaborador de datos de Storage Blob proporciona a la aplicación web (representada por la identidad administrada asignada por el sistema) acceso de lectura, escritura y eliminación al contenedor de blobs y a los datos.
Nota:
Algunas operaciones en contenedores de blobs privados no son compatibles con RBAC de Azure, como ver blobs o copiar blobs entre cuentas. Un contenedor de blobs con nivel de acceso privado requiere un token de SAS para cualquier operación que no esté autorizada por RBAC de Azure. Para obtener más información, consulte Cuándo usar una firma de acceso compartido.
En Azure Portal, vaya a la cuenta de almacenamiento para conceder acceso a la aplicación web. Seleccione Control de acceso (IAM) en el panel izquierdo y, después, Asignaciones de roles. Verá una lista de quién tiene acceso a la cuenta de almacenamiento. Ahora quiere agregar una asignación de roles a un robot, la instancia de App Service que necesita acceso a la cuenta de almacenamiento. Seleccione Agregar>Agregar asignación de roles para abrir la página Agregar asignación de roles.
En la pestaña Tipo de asignación, seleccione Tipo de función de trabajo y, a continuación, Siguiente.
En la pestaña Rol, seleccione el rol Colaborador de datos de blobs de almacenamiento en la lista desplegable y, a continuación, seleccione Siguiente.
En la pestaña Miembros, seleccione Asignar acceso a ->Identidad administrada y, a continuación, seleccione Miembros ->Seleccionar miembros. En la ventana Seleccionar identidades administradas, busque y seleccione la identidad administrada creada para App Service en la lista desplegable Identidad administrada. Seleccione el botón Seleccionar.
Seleccione Revisar y asignar y, a continuación, seleccione Revisar y asignar una vez más.
Para acceder a los pasos detallados, vea Asignación de roles de Azure mediante Azure Portal.
Ahora, la aplicación web ya tiene acceso a la cuenta de almacenamiento.
Acceso a Blob Storage
Para obtener una credencial de token que el código pueda usar para autorizar solicitudes para Azure Storage, se utiliza la clase DefaultAzureCredential. Cree una instancia de la clase DefaultAzureCredential, que usa la identidad administrada para capturar los tokens y asociarlos al cliente del servicio. En el ejemplo de código siguiente se obtiene la credencial de token autenticada y se usa para crear un objeto de cliente del servicio que, luego, carga un nuevo blob.
Para ver este código como parte de una aplicación de ejemplo, consulte el ejemplo en GitHub.
Instalación de los paquetes de biblioteca cliente
Instale el paquete NuGet de Blob Storage para que funcione con este servicio y la biblioteca cliente de Azure Identity del paquete NuGet de .NET para autenticarse con las credenciales de Microsoft Entra. Instale las bibliotecas cliente mediante la interfaz de línea de comandos (CLI) de .NET o la consola del administrador de paquetes de Visual Studio.
CLI de .NET
Abra una línea de comandos y cambie al directorio que contiene el archivo del proyecto.
Ejecute los comandos de instalación.
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
Consola del Administrador de paquetes
Abra el proyecto o la solución en Visual Studio y abra la consola mediante Herramientas>Administrador de paquetes NuGet>Consola del Administrador de paquetes.
Ejecute los comandos de instalación.
Install-Package Azure.Storage.Blobs
Install-Package Azure.Identity
Ejemplo
using System;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;
using System.IO;
using Azure.Identity;
// Some code omitted for brevity.
static public async Task UploadBlob(string accountName, string containerName, string blobName, string blobContents)
{
// Construct the blob container endpoint from the arguments.
string containerEndpoint = string.Format("https://{0}.blob.core.windows.net/{1}",
accountName,
containerName);
// Get a credential and create a client object for the blob container.
BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerEndpoint),
new DefaultAzureCredential());
try
{
// Create the container if it does not exist.
await containerClient.CreateIfNotExistsAsync();
// Upload text to a new block blob.
byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);
using (MemoryStream stream = new MemoryStream(byteArray))
{
await containerClient.UploadBlobAsync(blobName, stream);
}
}
catch (Exception e)
{
throw e;
}
}
Limpieza de recursos
Si ya ha terminado con este tutorial y no necesita la aplicación web ni los recursos asociados, elimine los recursos que creó.