[英]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.