尝试使用 AD 令牌/承载令牌 [Azure-Blob][Bearer-Token] 在 Azure Blob 中放置文件时授权权限不匹配
Posted
技术标签:
【中文标题】尝试使用 AD 令牌/承载令牌 [Azure-Blob][Bearer-Token] 在 Azure Blob 中放置文件时授权权限不匹配【英文标题】:Authorization Permission Mismatch when trying to PUT a file in Azure Blob with AD token/ Bearer Token[Azure-Blob][Bearer-Token] 【发布时间】:2021-06-06 01:52:41 【问题描述】:我能够CreateContainers、ListContainers、ListBlobs,但是当我尝试向上传或删除文件发出PUT/DELETE
请求时在 Azure 存储 blob 中,但在发出请求后显示以下错误:
403
This request is not authorized to perform this operation using this permission.
'content-length': '279',
'content-type': 'application/xml',
server: 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0',
'x-ms-request-id': '4de6c154-f01e-0051-7ce4-1314ef000000',
'x-ms-version': '2018-03-28',
'x-ms-error-code': 'AuthorizationPermissionMismatch',
date: 'Mon, 08 Mar 2021 06:32:44 GMT',
connection: 'close'
upload/PUT
文件的代码是:
const request = require("request");
require("dotenv").config();
const account = process.env.ACCOUNT_NAME || "";
const containerName = "demo";
const blobName = "dummyfile1.txt";
const blobContent = "Hello, This will be written in file";
const contentLength = new TextEncoder().encode(blobContent).length;
var strTime = new Date().toUTCString();
const options =
url: `https://$account.blob.core.windows.net/$containerName/$blobName`,
headers:
Authorization: "Bearer <BearerToken>",
"x-ms-date": strTime,
"x-ms-version": "2018-03-28",
"x-ms-blob-type": "BlockBlob",
"Content-Length": contentLength,
"Content-Type": 'application/text-plain',
,
body: blobContent,
;
function callback(error, response, body)
console.log(response.statusCode);
console.log(response.statusMessage);
console.log(response.headers);
request.put(options, callback);
我在这里手动替换我通过 POSTMAN 获取的那个:
另外,我在应用中添加了Storage Data Contributor的权限:
我已将 Azure 存储、user_impersonation 权限也委托给了应用程序。
但是,同样的错误仍然存在。
【问题讨论】:
answer 使用客户端凭据流。但是你在这个问题中使用auth code flow。尝试添加Azure Storage permission 并使用https://storage.azure.com/user_impersonation offline_access
范围。
@Pamela 我尝试使用https://storage.azure.com/user_impersonation offline_access
通过 POSTMAN 访问承载令牌并使用该承载令牌来运行此请求。但是,它仍然给出了相同的错误消息。是的,同样在上一个问题中,我试图通过客户端凭据获取承载令牌,我试图通过身份验证代码流获取它。注意:我已将存储 Blob 数据贡献者提供给应用程序。
您应该在门户中添加 Azure 存储委托权限,请参阅 i.stack.imgur.com/XniAN.png。我试过你的代码,是正确的。
我已经将Azure Storage委派权限指定为user_impersonation,但还是同样的错误,我在问题更新中添加了截图。
这很奇怪。稍后我将添加有关访问令牌的详细步骤。
【参考方案1】:
使用auth code flow时,登录用户需要Azure Storage的权限。使用Storage Blob Data Contributor
角色时,您需要将角色分配添加到您的帐户,而不是应用程序(只有客户端凭据流需要应用程序角色)。
然后将 Azure Storage 权限添加到 API Permissions。
此外,https://<account-name>.blob.core.windows.net/user_impersonation
和 https://storage.azure.com/user_impersonation
都可以用于作用域。有关 Azure 存储资源 ID(范围)的更多详细信息,请参阅here。
https://$account.blob.core.windows.net/.default
或 https://storage.azure.com/.default
适用于客户端凭据流。
步骤:
-
在浏览器中获取授权码
注意:登录 azure 帐户时,您应该接受请求的权限。
https://login.microsoftonline.com/tenant-id/oauth2/v2.0/authorize?
client_id=client-id
&response_type=code
&redirect_uri=https://localhost:44300/
&response_mode=query
&scope=https://account.blob.core.windows.net/user_impersonation
&state=12345
&prompt=consent
-
获取访问令牌和刷新令牌。尝试解码https://jwt.io/中的访问令牌,查看
aud
,它看起来像https://xxxx.blob.core.windows.net
。
-
最后,在您的代码中测试访问令牌。
【讨论】:
我可以使用该承载令牌来 ListContainer、ListBlobs、CreateContainer。但我无法创建 Blob、删除 Blob、GetBlob 是否需要它们的特殊角色或权限? 嗨,@MayankPatel。您是否为您的帐户添加了Storage Blob Data Reader
角色?
不,我已将Storage Blob Data Contributor
添加为角色。如问题中的屏幕截图所示。
仅适用于应用程序,不适用于已登录用户。尝试给用户添加Storage Blob Data Contributor
,大约10分钟后测试。而且我已经在我身边添加了角色!忘记检查了:(
我在没有这个角色的情况下测试,它返回403。需要太长时间才能生效。为用户帐户添加角色很重要。以上是关于尝试使用 AD 令牌/承载令牌 [Azure-Blob][Bearer-Token] 在 Azure Blob 中放置文件时授权权限不匹配的主要内容,如果未能解决你的问题,请参考以下文章