Azure Blob 容器 SAS 在代码中工作,而不是 AzCopy
Azure Blob Container SAS Works in Code and Not AzCopy
我正在使用以下代码为使用存储客户端 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 更改该参数。谁知道为什么会这样?我将 post 更新 Fiddler 内容。
正如您所做的那样,我进行了测试以生成与安装 WindowsAzure.Storage v8.0.0 的应用程序中的访问策略关联的 SAS 令牌,我可以通过 SAS 令牌从我的容器下载 blob在我的应用程序中生成。 AzCopy v5.0.0 和最新版本 (5.2.0) 都可以识别此有效的 SAS 令牌。
请检查您生成 SAS 令牌后是否可以在浏览器中访问 https://{storageaccount}.blob.core.windows.net/{mycontainer}/items.txt?{sas token}
。
另外,请尝试升级SDK,增加ExpiryTime,或者新建一个容器,做同样的测试,看看是否会出现同样的问题。
我正在使用以下代码为使用存储客户端 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 更改该参数。谁知道为什么会这样?我将 post 更新 Fiddler 内容。
正如您所做的那样,我进行了测试以生成与安装 WindowsAzure.Storage v8.0.0 的应用程序中的访问策略关联的 SAS 令牌,我可以通过 SAS 令牌从我的容器下载 blob在我的应用程序中生成。 AzCopy v5.0.0 和最新版本 (5.2.0) 都可以识别此有效的 SAS 令牌。
请检查您生成 SAS 令牌后是否可以在浏览器中访问 https://{storageaccount}.blob.core.windows.net/{mycontainer}/items.txt?{sas token}
。
另外,请尝试升级SDK,增加ExpiryTime,或者新建一个容器,做同样的测试,看看是否会出现同样的问题。