Azure 使用 REST api 和托管标识创建 blob 容器 - 403 错误
Posted
技术标签:
【中文标题】Azure 使用 REST api 和托管标识创建 blob 容器 - 403 错误【英文标题】:Azure create blob container using REST api and managed identity - 403 error 【发布时间】:2021-09-02 03:47:59 【问题描述】:我正在尝试使用 REST api 在存储帐户下创建 blob 容器
我正在使用托管标识(用于应用服务、节点应用)与存储帐户进行交互。此托管标识对资源组和存储帐户具有必要的权限 - 存储帐户参与者和存储 Blob 数据参与者
这是我正在遵循的步骤:
获取“https://storage-account-name.blob.core.windows.net”资源上托管标识的访问令牌(参考:https://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity?tabs=dotnet#obtain-tokens-for-azure-resources)
构造请求并调用 REST api 来创建容器(参考:https://docs.microsoft.com/en-us/rest/api/storageservices/create-container)
我在第二步中发送的强制性标题是:
授权:不记名访问令牌 x-ms-日期:2021-06-17T09:01:48.667Z x-ms-版本:2020-04-08我得到: statusCode: 403, statusMessage: '服务器未能验证请求。确保 Authorization 标头的值格式正确,包括签名。'
在发送授权标头时我有什么遗漏吗?找不到任何使用托管标识调用创建容器 api 的示例。
另一种选择是使用 blob 存储 sdk (https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-nodejs),但找不到任何使用托管标识创建容器的示例。
非常感谢任何使这项工作的指针。
谢谢,
【问题讨论】:
【参考方案1】:首先,您无法使用托管标识调用 Rest API。 Authorization
header 需要授权方案、账户名和签名。
在 Node.js 中使用 JavaScript v12 SDK 管理 blob:
您可以将@azure/identity
用于托管身份。
const ManagedIdentityCredential = require("@azure/identity");
const BlobServiceClient = require("@azure/storage-blob");
const credential = new ManagedIdentityCredential("<USER_ASSIGNED_MANAGED_IDENTITY_CLIENT_ID>");
const blobServiceClient = new BlobServiceClient(
`https://$account.blob.core.windows.net`,
credential
);
【讨论】:
谢谢。设法按照建议使用 azure identity 和 blob storage sdk 使其工作(也参考:docs.microsoft.com/en-us/javascript/api/overview/azure/…)。使用 DefaultAzureCredential,我也在使用系统托管标识。以上是关于Azure 使用 REST api 和托管标识创建 blob 容器 - 403 错误的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Azure 函数和 Azure Web API 之间启用托管标识?
Azure Functions App with APIM 使用托管标识 - 身份验证和授权
使用 Terraform 创建具有托管标识的 Azure AKS 会导致 AutoUpgradePreview 未启用错误