列出存储容器内容时获取 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的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中生成 SAS 令牌以下载 Azure 数据存储容器中的文件