共享访问签名 - 签名不匹配

时间:2018-05-14 06:12:54

标签: c# azure-blob-storage

尝试使用SAS令牌时出错。

我在容器上生成令牌,如下所示:

var client = _account.CreateCloudBlobClient();
var container = client.GetContainerReference("2017-med");
var sas = container.GetSharedAccessSignature(new SharedAccessBlobPolicy
{
   Permissions = SharedAccessBlobPermissions.Read,
   SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddYears(5)
});

我将它附加到容器中的资源的URL,并在访问URL时收到此错误消息:

  

签名不匹配。要使用的字符串是r   2023-05-14T05:48:34Z / blob / myblobname / 2017-med 2017-07-29

是否可以为容器中的资源使用容器令牌?或者还有什么在这里发挥作用?

1 个答案:

答案 0 :(得分:0)

正如我测试的那样,您在资源管理器中搜索sasuri并且只读取您设置的容器权限。

我建议您可以在sas政策中添加列表权限,如下所示:

var sas = container.GetSharedAccessSignature(new SharedAccessBlobPolicy
{
   Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.List
   SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddYears(5)
});

然后当您在资源管理器中搜索它时,您可以列出容器中的所有blob,以判断您生成的sasuri是否正确。

List Blobs请求可以如下构造。  建议使用HTTPS。将myaccount替换为存储帐户的名称:

https://myaccount.blob.core.windows.net/mycontainer?restype=container&comp=list&sastoken

实际上,当您为容器生成sasuri时,您可以使用sasuri访问容器中的blob并在您的许可下执行某些操作。

string sasUri = uricontainer;
CloudBlockBlob blob = new CloudBlockBlob(new Uri(sasUri));

<强>更新

  

签名不匹配。使用的字符串是r 2023-05-14T05:48:34Z / blob / myblobname / 2017-med 2017-07-29

正如您所提供的,我发现您的storagename是 myblobname ,这是非常困惑的。

我发现确实存在名为myblobname 的storagename。所以,我想也许你有一个拼接错误。

您可以使用var bloburi = container.Uri + sas;获取完整的uri。

如果你想用完整的uri显示列表或其他操作,你可以参考我提供的上述代码。