【发布时间】:2022-01-03 05:49:33
【问题描述】:
tl;dr: 我正在尝试使用 SAS 从 C# 连接到 Azure BlobStorage,但似乎无法通过 StorageException 说“服务器无法验证请求。 "我怀疑我的连接字符串有问题。
我正在使用库 Microsoft.Azure.Storage.Blob11.2.3.0 和 Microsoft.Azure.Storage.Common11.2.3.0 从 .NET Core 3.1 应用程序连接到 Azure BlobStorage。
我建立此连接的 C# 代码如下:
var storageAccount = CloudStorageAccount.Parse(connectionString);
var blobClient = storageAccount.CreateCloudBlobClient();
当使用包含字段AccountName、AccountKey、EndpointSuffix 和DefaultEndpointsProtocol(这是https)1 的连接字符串时,它可以完美运行。 (我可以连接并执行诸如枚举容器和 blob 之类的操作,还可以创建容器和 blob 并上传数据。)
现在,我应该使用 SAS 连接到同一个 BlobStorage。为此,我得到了以下信息(这里匿名为某种“占位符”,因为我将在下面引用它们):
-
<StorageAccount>(与上述连接字符串中AccountName字段的值相同) <Container><Blob-SAS-Token>-
<Blob-SAS-URL>(这实际上是由此处找到的其他信息组成,即<DefaultEndpointsProtocol>://<StorageAccount>.blob.<EndpointSuffix>/<Container>?<Blob-SAS-Token>)
如上所述,我可以使用<Blob-SAS-URL> 成功地从Microsoft Azure 存储资源管理器 建立与上述 BlobStorage 容器的连接。2
但是,到目前为止,我无法从我的 C# 代码中成功使用 SAS。
我尝试了各种方法来编写我的连接字符串,例如:
BlobEndpoint=<DefaultEndpointsProtocol>://<StorageAccount>.blob.<EndpointSuffix>;SharedAccessSignature=<Blob-SAS-Token>BlobEndpoint=<DefaultEndpointsProtocol>://<StorageAccount>.blob.<EndpointSuffix>/<Container>;SharedAccessSignature=<Blob-SAS-Token>
根据docs,这应该工作。在那里,一个基于 SAS 的连接字符串被概述为包含最多五个字段 - BlobEndpoint、QueueEndpoint、TableEndpoint、FileEndpoint 和 SharedAccessSignature - 其中只有(任何)四个端点之一 必须在 SAS 旁边指定。
我还尝试过创建/填充CloudStorageAccount 实例,而不是通过(可能格式错误的)连接字符串,例如:
var storageAccount = new CloudStorageAccount(
new StorageCredentials("<Blob-SAS-Token>"),
"<StorageAccount>", "<EndpointSuffix>", true);
不幸的是,无论我尝试什么,只要我尝试以这种方式从 BlobStorage 检索任何数据,就会抛出 Microsoft.Azure.Storage.StorageException,声明
服务器未能验证请求。确保 Authorization 标头的值格式正确,包括签名。
我本地机器上的 UTC 时间与我可以在在线资源上找到的当前 UTC 时间完全匹配。因为我可以从同一台机器上的另一个应用程序连接我的 SAS 信息,所以问题很可能与环境的任何方面无关(例如在某些阻止列表或类似列表中缺少我的 IP 地址条目),无论如何。相反,我怀疑我没有提供足够的信息来建立连接。
我必须进行哪些更改才能使此连接正常工作?
1:我将在写这篇文章时为各种标识符和凭据使用某种“占位符”,以免泄露任何机密信息。我希望这不会太混乱。另一方面,它实际上应该允许通过几个查找和替换操作轻松地将信息调整到可用的样本端点。
2:为此,我右键单击 Storage Accounts 树节点,然后连接到 Azure 存储... > Blob 容器 > SAS URL(共享访问签名
【问题讨论】:
-
这里有一个类似的问题你可以参考stackoverflow.com/questions/70097124/…
-
@SwethaKandikonda-MT:这确实很有帮助,谢谢。你可以添加一个答案吗?对我来说,这里的关键点是,当使用(特定于容器的)SAS 时,我不能只使用与整个存储帐户的连接字符串相同的代码来连接到 BlobStorage。也就是说,没有办法将 SAS 和目标容器放入连接字符串并将其提供给
CloudStorageAccount.Parse(或者有吗?)。
标签: azure .net-core azure-blob-storage shared-access-signatures