gpt4 book ai didi

c# - Azure,存储共享访问签名 2.0 的访问被拒绝

转载 作者:太空狗 更新时间:2023-10-30 00:54:17 24 4
gpt4 key购买 nike

我在获取共享访问签名以与 Storage 2.0 配合使用时遇到问题..

我使用的代码:

if (blob.Exists())
{
var expires = DateTime.UtcNow.AddMinutes(30);
var sas = blob.GetSharedAccessSignature(new Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy
{
Permissions = Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Read,
SharedAccessExpiryTime = expires
});
url = string.Concat(blob.Uri.AbsoluteUri, sas);
}
return url;

但是如果我调试 session 并将 URL 粘贴到浏览器中,则会收到错误:

<Error>
<Code>AuthenticationFailed</Code>
<Message>
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:c1a1dd2b-bf4a-4a6b-bab2-ab1cb9363d27 Time:2012-11-19T14:41:51.1254531Z
</Message>
<AuthenticationErrorDetail>
Signature did not match. String to sign used was r 2012-11-19T15:11:36Z /container/path/1356/pic.jpg 2012-02-12
</AuthenticationErrorDetail>
</Error>

有人可以帮忙吗?

更新:生成的 URL 如下所示: https://storageaccountname.blob.core.windows.net/container/path/1356/pic.jpg?sv=2012-02-12&se=2012-11-19T19%3A25%3A32Z&sr=b&sp=r&sig=s6QIdwAGY4xC8fs4L9pK8hAGIY%2F8x58aqBcFbejYPdM%3D

最佳答案

我遇到了同样的错误。在我更新到 2.0 之前,这段代码曾经可以工作:

var sharedAccessPolicy = new SharedAccessBlobPolicy
{
SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-10),
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(30),
Permissions = SharedAccessBlobPermissions.Read
};
var sharedAccessSignature = _blockblob.GetSharedAccessSignature(sharedAccessPolicy);
return _blockblob.Uri.AbsoluteUri + sharedAccessSignature;

我得到了uri:

http://127.0.0.1:10000/devstoreaccount1/original/c04d2a1c-980b-42c5-b76e-b71185f027b6.jpg?sv=2012-02-12&st=2012-11-20T08%3A30%3A24Z&se=2012-11-20T09%3A10%3A24Z&sr=b&sp=r&sig=9%2BVg6mSGqyrfr5rPlNJ6GSv%2BHN3J9k%2FWFRLYmx3xCvQ%3D

更新,已解决:

在上面的代码中,我有 _blockBlob。这是在构造函数中设置的

var blobClient = account.CreateCloudBlobClient();
var container = blobClient.GetContainerReference(containerName);
CloudBlockBlob _blockblob = container.GetBlockBlobReference(fileName);

将最后一行(按照 clausndk 的建议)更改为

ICloudBlob _test = container.GetBlobReferenceFromServer(fileName);

解决了问题,因为在 _test 上调用 GetSharedAccessSignature 会产生不同的(有效)签名。

查看 Azure 存储的源代码并在我的应用程序上使用调试器,我找到了问题的原因。在我的代码中,我有一个带有尾部斜杠(original/)的containerName。除了 GetSharedAccessSignature 之外,这不是问题。这里,额外的斜杠弄乱了 canonicalName(在给出双斜杠的代码中添加了一个斜杠),这使得签名无效。 GetBlobReferenceFromServer 起作用的原因是它向服务器(通过 REST API)请求 blob,并且生成的 CloudBlockBlob 已删除斜杠。

在我的代码中,我删除了尾部斜杠,但 Sandrino Di Mattia 的在容器名称上使用 .Trim('/') 的解决方案也有效。我认为这比使用 GetBlobReferenceFromServer 更好,因为它会导致额外的服务器调用。

希望 CloudBlockBlobBase 中 GetCanonicalName 的实现能够在将来进行更改以处理尾部斜杠(为此我在 GitHub 上创建了一个问题),但目前此“解决方法”有效。

关于c# - Azure,存储共享访问签名 2.0 的访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13456606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com