如何使用 SAS 下载 Blob

How to download a Blob using a SAS

我正在尝试使用 AzCopy 5.1.0 从使用存储资源管理器生成的 SAS 的 Blob 存储容器下载 单个 blob:

https://myaccount.blob.core.windows.net/mycontainer/[blob-uuid]?st=2016-11-23T18%3A26%3A00Z&se=2016-11-24T18%3A26%3A00Z&sp=rl&sv=2015-12-11&sr=b&sig=[signature]

azcopy /Source:https://myaccount.blob.core.windows.net/mycontainer /SourceSAS:"?st=2016-11-23T18%3A26%3A00Z&se=2016-11-24T18%3A26%3A00Z&sp=rl&sv=2015-12-11&sr=b&sig=[signature]" /Dest:"c:\data"

如果 /Source 应该是 blob 容器,而 /SourceSAS 应该是 SAS token,那么我需要在某个地方传递实际的 Blob 密钥( [blob-uuid]).

恕我直言,这应该是 /SourceKey,但是在那里指定我的 blob 键 returns 错误:"The supplied storage key (SourceKey) is not a valid Base64 string." 这与将参数描述为 "Storage account key".

我能找到的唯一其他候选对象是 /Pattern,但对于通过枚举容器内容下载 blob 的情况来说,这似乎更合适。这似乎与我在此处指定确切的 blob 键时得到的 403 错误一致;容器是私有的。

无论如何,AzCopy 抱怨 "Server failed to authenticate the request. Make sure the value of the Authorization header is formed correctly including the signature." 根据我的经验,这表明生成 SAS 签名的原始 URI 未正确重建。

我可以通过curl直接使用原来的SAS URI,所以不是签名不一致的问题。

我也尝试过使用 SDK 以编程方式生成 SAS URI,以便我可以指定共享访问策略,但这也不起作用。我仍然认为 AzCopy 需要 SAS URI 的缺失部分。

阅读 docs:

Download single blob:

AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer /Dest:C:\myfolder /SourceKey:key /Pattern:"abc.txt"

/Source 是容器的 URI

/SourceKey 将是您的密钥,但开头没有问号

/Pattern 将是您的 blob

的名称

/Destination 将是您要将 blob 下载到的本地文件夹名称

我们可以使用帐户密钥容器SAS令牌从容器源下载一个blob。不支持 blob URI 作为下载源 blob.The 以下快照是我的测试结果。

1.Use 容器作为源和容器 SAS 令牌。使用模式 select 下载 blob。

AzCopy /Source:https://mystorageAccount.blob.core.windows.net/mycontainer /Dest:C:\myfolder /SourceSAS:"?st=2016-11-24T02%3A34%3A00Z&se=2016-11-25T02%3A34%3A00Z&sp=rl&sv=2015-12-11&sr=c&sig=[s‌​ignature]" /Pattern:blobName

2.Use 容器作为源和帐户密钥 token.It 也可以工作。如果我使用了错误的密钥标记 (connectionstring),那么我会得到 "The supplied storage key (SourceKey) is not a valid Base64 string" error

3.Use 容器作为源和 blob SAS 令牌,它不起作用

4.Use blob 作为源和容器 SAS 令牌,不支持无模式

[更新]

我们可以使用 azure storage .Net SDK 使用 blob SAS 令牌从 blob uri 下载 blob。

StorageCredentials storageCredentials = new StorageCredentials("blob sas token");//without "?"
            var blobName = "blobName";
            var downloadFolder = @"c:\filefolder";
            var filePath = Path.Combine(downloadFolder, blobName);
            CloudBlockBlob sourceBlockBlob = new CloudBlockBlob(new Uri("blob url"), storageCredentials);
            sourceBlockBlob.DownloadToFile(filePath, FileMode.Create);

AzCopy 传输目标始终是目录,而不是单个 blob/file,因此 AzCopy 需要容器级 SAS 而不是 blob SAS。 该模式仅用于过滤出要传输的对象。

我们将打开一个任务来跟踪使用 blob SAS 下载单个 blob。无论如何,这与当前的 AzCopy 逻辑不一致,我们将把它作为一个新的功能请求。