繁体   English   中英

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

[英]Azure Shared Access Signature - Signature did not match

我收到此错误:

<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:6c3fc9a8-cdf6-4874-a141-10282b709022 Time:2014-07-30T10:48:43.8634735Z
</Message>
<AuthenticationErrorDetail>
Signature did not match. String to sign used was rwl 2014-07-31T04:48:20Z /acoustie/$root 2014-02-14
</AuthenticationErrorDetail>
</Error>

生成sas(共享访问签名),然后在容器uri的末尾将该sas粘贴到浏览器中时,便会得到它。 这是生成的sas的完整地址:

https://acoustie.blob.core.windows.net/mark?sv=2014-02-14&sr=c&sig=E6w%2B3B8bAXK8Lhvvr62exec5blSxsA62aSWAg7rmX4g%3D&se=2014-07-30T13%3A30%3A14Z&sp=rwl

我已经搜索过SO和Google并尝试了很多组合,据我所知我做的一切正确,我知道不是,我只是看不到...真的希望有人可以提供帮助:- \\

需要明确的是,我在容器上而不是在特定的blob上,也不在根容器上生成了一个sas。 Blob上的访问被定义为Public Blob。 我的最终目标是仅允许使用sas写入容器,而在“调试”中,我向SharedAccessBlobPolicy添加了大多数权限。

我尝试在容器名称的开头和结尾添加\\。 没变。

这是我用来生成sas的代码:

    var blobClient = storageAccount.CreateCloudBlobClient();
    //Get a reference to the blob container 
    var container = blobClient.GetContainerReference(containerName);

    // Do not set start time so the sas becomes valid immediately.
    var sasConstraints = new SharedAccessBlobPolicy 
    {
        SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(30), 
        Permissions = SharedAccessBlobPermissions.Write 
        | SharedAccessBlobPermissions.Read
        | SharedAccessBlobPermissions.List,
    };

    var sasContainerToken = container.GetSharedAccessSignature(sasConstraints);

    //Return the URI string for the container, including the SAS token.
        var sas = string.Format("{0}{1}", container.Uri.AbsoluteUri, sasContainerToken);
        Logger.Debug("SAS: {0}", sas);
        return sas;

它生成一个签名,但似乎不是一个有效的签名。

我尝试了不同的容器,更改了访问策略,无论是否有开始时间,将有效期从现在开始扩展到大于12小时(我处于UTC + 10时区),我更改它似乎无关紧要导致出现相同的“签名不匹配”错误。

我什至尝试使用旧版本的“ WindowsAzure.Storage”,所以现在尝试了4.2和4.1。 即使在不同的浏览器中尝试了uri,也确实不应该有所作为,但是...

任何建议,不胜感激:-)

简短答案:

comp=list&restype=container添加到您的SAS URL中,您不应收到此错误。

长答案:

本质上,从您的SAS URL中,Azure存储服务无法识别您尝试访问的资源是Blob还是容器,并假定它是Blob。 由于它假定资源类型为blob,因此它将$root blob容器用于SAS计算(您可以从错误消息中看到)。 由于SAS是针对mark斑点容器计算的,因此会出现此“ Signature Does Not Match错误。 通过指定restype=container您可以告诉存储服务将资源视为container 根据REST API规范, comp=list是必需的。

添加到@Gaurav Mantri Answer,为了再次检查权限,还可以在Azure Portal中创建OWN SAS令牌

在此处输入图片说明

由此您可以关联此comp=list&restype=container

您可以提供以下资源类型:

  1. 容器
  2. 宾语
  3. 服务

希望这对某些人有所帮助。

在花费大量时间后,实际错误不同于.net编译器引发的异常。 如果您在将Blob文件上传到存储设备时使用元数据字段,请检查元数据字符。 例如,我要添加元数据字段,例如描述,文件名等。...在描述字段中,我有一些垃圾字符,并且在运行时字符串文本查看器中发现了这些字符。

更改描述“测试文件描述”后,我的描述最初>测试文件描述。 一切正常。

我从不同的来源提取的元数据值为何会出现那些垃圾字符。 请删除/修改元数据的值,然后它将正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM