0

我正在使用以下代码使用 Storage Client SDK 版本 8.0.0 为 blob 容器生成 SAS,以匹配 AzCopy 使用的内容。

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("myconnectionstring");

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

        SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
        sasConstraints.SharedAccessStartTime = DateTime.Now.AddHours(-24);
        sasConstraints.SharedAccessExpiryTime = DateTime.Now.AddHours(24);
        sasConstraints.Permissions = SharedAccessBlobPermissions.List | SharedAccessBlobPermissions.Read;

        string sas = container.GetSharedAccessSignature(sasConstraints, null);

        Console.WriteLine(sas);

        Console.WriteLine(container.Uri);

        StorageCredentials creds = new StorageCredentials(sas);

        var sasContainer = new CloudBlobContainer(new Uri(container.Uri + sas));

        var items = sasContainer.GetBlobReference("items.txt");

这一切在代码中都可以正常工作,但是当我将 SAS 令牌复制到 AzCopy 以下载 blob 作为“SourceSAS”参数时,我得到一个 403 表示签名不匹配(通过 Fiddler)。用于创建签名的参数对我来说看起来不错。我很困惑为什么这在代码中有效,而不是通过 AzCopy。

如果我使用 Azure 存储资源管理器工具创建 SAS 令牌,它可以正常工作。此 SAS 令牌针对不同版本的服务,但我无法强制 SDK 更改该参数。有人知道为什么会这样吗?我将在更新中发布 Fiddler 内容。

4

1 回答 1

0

正如您所做的那样,我进行了测试以生成与安装 WindowsAzure.Storage v8.0.0 的应用程序中的访问策略相关联的 SAS 令牌,我可以通过在我的应用程序中生成的 SAS 令牌从我的容器中下载 blob。AzCopy v5.0.0 和最新版本 (5.2.0) 都可以识别此有效的 SAS 令牌。

请检查您是否可以https://{storageaccount}.blob.core.windows.net/{mycontainer}/items.txt?{sas token}在生成 SAS 令牌后在浏览器中访问。

另外,请尝试升级SDK并增加ExpiryTime,或者创建一个新的容器并做同样的测试,看看是否会出现同样的问题。

于 2017-03-09T08:26:03.633 回答