尝试使用 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://&lt;account-name&gt;.blob.core.windows.net/user_impersonationhttps://storage.azure.com/user_impersonation 都可以用于作用域。有关 Azure 存储资源 ID(范围)的更多详细信息,请参阅here。

https://$account.blob.core.windows.net/.defaulthttps://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 中放置文件时授权权限不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Rest Assured 从 KeyCloak 服务获取承载令牌

HttpClient中的授权承载令牌?

如果使用了授权承载令牌,则为 400 错误请求

使用授权承载请求时在 Firebase 函数中获取令牌

我如何从 HttpClient 获取承载令牌?

laravel 自己的 api 使用来自具有承载令牌的控制器