Active Directory 从浏览器访问 Azure 存储
Active Directory access Azure Storage from browser
我想使用 Azure Active Directory 允许用户从单页 Web 应用程序读取和写入 Azure 存储(特别是所有 Blob 和表)。
我是这样开始的:
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);
这完全没问题!我可以看到帐户上的所有 table。但是后来我想列出 table 中 中 中的一些数据。所以我做了:
const client = new TableClient(
`https://${myAuthConfig.storageAccountName}.table.core.windows.net`,
'<table name>',
credentials
);
client.listEntities().byPage().next().then(console.log);
但这给出了一个错误:
{
"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"
}
}
}
这个错误让我很困惑。据我所知,我所做的一切都是正确的。我遵循了每个教程。我已经为我的应用程序设置了活动目录权限以使用存储 API,我的 Microsoft 帐户有权访问 tables,OCRS 已启用,等等
我不确定为什么我可以看到 table 但看不到里面的内容。我尝试使用 InteractiveBrowserCredential.authenticate
来显式设置范围,如下所示:
const scopes = ["User.Read"]
credentials.authenticate(scopes).then(console.log);
它适用于 User.Read
但我无法弄清楚哪些范围对应于存储 read/write 访问。如果我添加像 "Microsoft.Storage"
这样的 scopy,它会告诉我它不存在
有没有人遇到过这样的错误?我在这里应该做什么?
谢谢@gaurav mantri,在评论中发表您的建议作为答案。
根据错误,您的服务主体似乎没有访问您的 table 存储数据的权限。您应该使用存储帐户资源上的 RBAC 角色授予权限(添加到存储帐户贡献者或 readers),如下所示。或使用存储资源管理器授予权限。
在您的存储帐户中,请检查您是否有存储 Table 数据贡献者/存储 table 数据 reader 分配的角色,如@gaurav mantri
所评论
如果没有,您可以添加它们
进入您的存储帐户 > IAM > 添加角色分配,并添加特殊权限
如果角色已分配,问题可能是由于存储帐户受防火墙保护。请尝试在您的存储帐户的防火墙和虚拟网络中进行配置,以添加现有的虚拟网络或创建一个新的 vnet.If 没有问题,您可以允许从所有网络进行访问。
参考文献:
我想使用 Azure Active Directory 允许用户从单页 Web 应用程序读取和写入 Azure 存储(特别是所有 Blob 和表)。
我是这样开始的:
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);
这完全没问题!我可以看到帐户上的所有 table。但是后来我想列出 table 中 中 中的一些数据。所以我做了:
const client = new TableClient(
`https://${myAuthConfig.storageAccountName}.table.core.windows.net`,
'<table name>',
credentials
);
client.listEntities().byPage().next().then(console.log);
但这给出了一个错误:
{
"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"
}
}
}
这个错误让我很困惑。据我所知,我所做的一切都是正确的。我遵循了每个教程。我已经为我的应用程序设置了活动目录权限以使用存储 API,我的 Microsoft 帐户有权访问 tables,OCRS 已启用,等等
我不确定为什么我可以看到 table 但看不到里面的内容。我尝试使用 InteractiveBrowserCredential.authenticate
来显式设置范围,如下所示:
const scopes = ["User.Read"]
credentials.authenticate(scopes).then(console.log);
它适用于 User.Read
但我无法弄清楚哪些范围对应于存储 read/write 访问。如果我添加像 "Microsoft.Storage"
这样的 scopy,它会告诉我它不存在
有没有人遇到过这样的错误?我在这里应该做什么?
谢谢@gaurav mantri,在评论中发表您的建议作为答案。
根据错误,您的服务主体似乎没有访问您的 table 存储数据的权限。您应该使用存储帐户资源上的 RBAC 角色授予权限(添加到存储帐户贡献者或 readers),如下所示。或使用存储资源管理器授予权限。
在您的存储帐户中,请检查您是否有存储 Table 数据贡献者/存储 table 数据 reader 分配的角色,如@gaurav mantri
所评论如果没有,您可以添加它们 进入您的存储帐户 > IAM > 添加角色分配,并添加特殊权限
如果角色已分配,问题可能是由于存储帐户受防火墙保护。请尝试在您的存储帐户的防火墙和虚拟网络中进行配置,以添加现有的虚拟网络或创建一个新的 vnet.If 没有问题,您可以允许从所有网络进行访问。
参考文献: