列出存储容器内容时获取 Azure 存储以返回 blob URL

Posted

技术标签:

【中文标题】列出存储容器内容时获取 Azure 存储以返回 blob URL【英文标题】:Get Azure Storage to Return blob URL when listing storage container contents 【发布时间】:2021-12-06 18:20:01 【问题描述】:

我正在尝试使用服务主体通过 PowerShell 访问和列出 Azure 存储容器的内容。我已经能够获取服务主体的令牌并使用它来访问存储帐户,但是当我运行此命令时

$iwrParams = @
    'Uri' = 'https://myaccount.blob.core.windows.net/mycontainer?restype=container&comp=list'
    'UseBasicParsing' = $true
    'ContentType' = 'application/xml'
    'Headers' = @
        'Authorization' = "Bearer $($token.access_token)"
        'x-ms-version' = '2017-11-09'
    


Invoke-WebRequest @iwrParams

我从这里得到一个返回,但返回的 xml 内容从不显示每个返回的 blob 的 URL。如果您查看https://docs.microsoft.com/en-us/rest/api/storageservices/enumerating-blob-resources#list-blobs-and-snapshots 的返回值,它表明对于每个 blob,它应该返回一个名称、网址和各种其他属性。当我运行上面的代码时,我得到了除了 URL 之外的所有内容。

现在真正有趣的是,如果我将容器访问权限更改为匿名公共并运行此代码,我会按预期返回 Url。

$iwrParams = @
    'Uri' = 'https://myaccount.blob.core.windows.net/mycontainer?comp=list'
    'UseBasicParsing' = $true
    'ContentType' = 'application/xml'


Invoke-WebRequest @iwrParams

老实说,问题似乎是在使用任何类型的身份验证访问时必须包含 restype=container

我的问题是,当不使用匿名访问列出容器内容时,是否有人知道如何获取返回的每个 blob 的 URL?

我想在不借助 Az 模块的情况下做到这一点。

【问题讨论】:

【参考方案1】:

您无法看到响应中返回的 URL 的原因是您的代码使用的存储 REST API 版本 (2017-11-09)。从 REST API 版本 2013-08-15 开始,基本上从响应中删除了 Blob URL 属性。来自这个link

在 2013-08-15 及更高版本中,EnumerationResults 元素 包含指定 blob 端点的 ServiceEndpoint 属性,并且 一个 ContainerName 字段,指定容器的名称。在 以前的版本这两个属性在 容器名称字段。 在 2013-08-15 及更高版本中,Url Blob 下的元素已被移除

关于您对为什么匿名列出 Blob 时可以看到 URL 属性的评论,这是因为如果在请求中未指定 REST API 版本,存储服务将使用最旧的 REST API 版本来处理请求(如果是默认版本)尚未设置。来自link

如果对通用存储帐户的匿名请求没有 指定 x-ms-version 标头和默认版本 尚未使用 Set Blob Service Properties 设置服务,则 服务使用可能的最早版本来处理请求。

考虑到您希望使用基于 Azure AD 的授权,您可以使用的最早版本是 2017-11-09,因此无法获取响应正文中返回的 Blob URL。

一种选择是使用 Blob 容器 URL 和 Blob 名称手动构造 Blob URL。其他选项是使用 Shared Key Authorization 而不是 Azure AD 授权,并为请求中的 x-ms-version 请求标头指定早于 2013-08-15 的版本。在这种情况下,您需要使用 here 提供的说明手动计算 Authorization 标头值。

【讨论】:

以上是关于列出存储容器内容时获取 Azure 存储以返回 blob URL的主要内容,如果未能解决你的问题,请参考以下文章

csharp Azure存储公共容器列出所有图像

在 Java 中生成 SAS 令牌以下载 Azure 数据存储容器中的文件

C# Azure.Storage.Blobs SDK 如何列出和压缩容器中的所有文件并将压缩文件存储在另一个容器中

对 Azure 存储的只写访问(不读取、不列出、不删除)

从 Azure 存储 Blob 访问元数据

将文件上传到 Azure 存储的 POST 方法 - 返回啥