Quiero usar Azure Active Directory para permitir que los usuarios lean y escriban en el almacenamiento de Azure (específicamente todos los blobs y tablas ) desde una aplicación web de una sola página.
Empecé así:
import { InteractiveBrowserCredential } from '@azure/identity'; import { TableClient, TableServiceClient } from '@azure/data-tables'; const credentials = new InteractiveBrowserCredential({ clientId: myAuthConfig.clientId, tenantId: myAuthConfig.tenantId, }); const client = new TableServiceClient( `https://${myAuthConfig.storageAccountName}.table.core.windows.net`, credentials ); client.listTables().byPage().next().then(console.log);¡Esto funciona totalmente bien! Puedo ver todas las tablas de la cuenta. Pero luego quería enumerar algunos de los datos en una de las tablas. Así que lo hice:
const client = new TableClient( `https://${myAuthConfig.storageAccountName}.table.core.windows.net`, '<table name>', credentials ); client.listEntities().byPage().next().then(console.log);Pero esto da un error:
{ "odata.error": { "code":"AuthorizationPermissionMismatch", "message": { "lang":"en-US", "value":"This request is not authorized to perform this operation using this permission.\nRequestId:<uuid>\nTime:2021-10-28T18:04:00.0737419Z" } } }Estoy muy confundido por este error. Por lo que puedo decir, he hecho todo bien. Seguí todos los tutoriales. Configuré permisos de directorio activo para que mi aplicación use la API de almacenamiento, mi cuenta de Microsoft tiene permiso para acceder a las tablas, OCRS está habilitado, etc.
No estoy seguro de por qué tendría acceso para ver una tabla pero no ver lo que hay en ella. Traté de usar InteractiveBrowserCredential.authenticate para establecer explícitamente ámbitos como este:
const scopes = ["User.Read"] credentials.authenticate(scopes).then(console.log); Funciona bien para User.Read , pero no pude averiguar qué ámbitos correspondían al acceso de lectura/escritura de Storage. Si añadía un scopy como "Microsoft.Storage" me decía que no existía
¿Alguien ha tenido un error como este antes? ¿Qué se supone que debo hacer aquí?
Gracias @gaurav mantri, publicando su sugerencia en un comentario como respuesta.
Por error, parece que su principal de servicio no tiene permiso de acceso a los datos de almacenamiento de su tabla. Debe otorgar permiso mediante un rol RBAC en el recurso de la cuenta de almacenamiento (agregar a los contribuyentes o lectores de la cuenta de almacenamiento) como se muestra a continuación. O use Storage Explorer para otorgar permisos.
En su cuenta de almacenamiento, verifique si tiene roles de colaborador de datos de tabla de almacenamiento/lector de datos de tabla de almacenamiento asignados según lo comentado por @gaurav mantri
De lo contrario, puede agregarlos en su cuenta de almacenamiento > IAM > Agregar asignación de roles y agregar los permisos especiales.
Si los roles ya están asignados, es posible que el problema se deba a que la cuenta de almacenamiento está protegida por un firewall. Intente configurar en Firewall y redes virtuales de su cuenta de almacenamiento para agregar una red virtual existente o crear una nueva red virtual. Si no hay problema, puede permitir el acceso desde todas las redes.
Referencias: