![](/img/trans.png)
[英]How to Get a valid access token for my API and Microsoft Graph from Azure Active Directory?
[英]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);
这完全正常! 我可以看到帐户上的所有表。 但后来我想列出一些数据上的表。 所以我做了:
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 帐户有权访问表,启用了 OCRS 等。
我不知道为什么我可以看到一张桌子,但看不到里面有什么。 我尝试使用InteractiveBrowserCredential.authenticate
显式设置如下范围:
const scopes = ["User.Read"]
credentials.authenticate(scopes).then(console.log);
它适用于User.Read
但我无法弄清楚存储读/写访问对应的范围。 如果我添加了"Microsoft.Storage"
之类的副本,它会告诉我它不存在
以前有人遇到过这样的错误吗? 我应该在这里做什么?
谢谢@gaurav mantri,在评论中发布您的建议作为答案。
从错误来看,您的服务主体似乎无权访问您的表存储数据。 您应该使用 RBAC 角色对存储帐户资源(添加到存储帐户贡献者或读者)授予权限,如下所示。 或使用存储资源管理器授予权限。
在您的存储帐户中,请检查您是否按照@gaurav mantri 的评论分配了存储表数据贡献者/存储表数据读取者角色
如果没有,您可以将它们添加到您的存储帐户 > IAM > 添加角色分配,并添加特殊权限
如果已分配角色,则问题可能是由于存储帐户受防火墙保护。 请尝试在您的存储帐户的防火墙和虚拟网络中进行配置,以添加现有的虚拟网络或创建新的 vnet。如果没有问题,您可以允许从所有网络进行访问。
参考:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.