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

时间:2014-07-30 13:41:17

标签: c# azure azure-storage-blobs

我收到了这个错误:

<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和谷歌,并尝试了很多组合,据我所知,我正在做的一切正确,我知道我不是,我只是看不到它...真的希望有人可以帮助: - \

要清楚,我在容器上生成一个sas,而不是特定的blob,而不是在根容器上。 blob上的访问被定义为Public Blob。我的最终目标是简单地允许使用sas写入容器,而'debugging'我已经为SharedAccessBlobPolicy添加了大部分权限。

我尝试在容器名称的beginning and ending处添加\。没有变化。

这是我用来生成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;

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

我尝试了不同的容器,更改了Access策略,有无启动时间,将到期时间延长到&gt;从现在起12个小时(我在UTC + 10时区),我改变它似乎并不重要导致相同的“签名不匹配”错误。

我甚至尝试使用旧版本的'WindowsAzure.Storage',所以我现在尝试了4.2和4.1。甚至在不同的浏览器中试过uri,真的不应该有所作为但是嘿......

非常感谢任何建议: - )

3 个答案:

答案 0 :(得分:31)

简答:

comp=list&restype=container添加到您的SAS网址,您不会收到此错误。

长答案:

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

答案 1 :(得分:0)

添加到@Gaurav Mantri答案,为了仔细检查权限,您还可以在Azure门户中创建OWN SAS令牌

enter image description here

通过此,您可以将此comp=list&restype=container

联系起来

您可以提供的资源类型:

  1. 容器
  2. 对象
  3. 服务
  4. 希望这对某人有帮助。

答案 2 :(得分:0)

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

在更改描述“测试文件描述”之后,

我的原始描述>测试文件描述。一切正常。

我从不同的来源中提取的

元数据值说明了为什么会出现那些垃圾字符。请删除/修改元数据的值,这样就可以正常工作。