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

C# Azure共享访问签名-签名不匹配,c#,azure,azure-storage-blobs,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-a14

我得到了这个错误:

<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(共享访问签名)然后将该sas粘贴到容器uri的末尾到浏览器中时,我得到了它。这是生成的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,并尝试了很多组合,就我所知,我做的每件事都是正确的,我知道我不是,我只是看不到…真的希望有人能帮我:-\

明确地说,我在容器上生成sas,而不是在根容器上生成特定的blob。对blob的访问被定义为公共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,您将不会收到此错误

长答案:


基本上,Azure存储服务无法从您的SAS URL识别您尝试访问的资源是blob还是容器,并假定它是blob。由于它假定资源类型为blob,因此它使用
$root
blob容器进行SAS计算(您可以从错误消息中看到)。由于SAS是为
mark
blob容器计算的,因此您得到的
签名不匹配
错误。通过指定
restype=container
,您告诉存储服务将资源视为
container
<根据REST API规范,需要code>comp=list。

添加到@Gaurav Mantri Answer中,为了双重检查权限,您还可以在Azure Portal中创建自己的SAS令牌

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

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

  • 容器
  • 反对
  • 服务

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

    在花费大量时间之后,实际错误与.net编译器引发的异常不同。如果在将blob文件上载到存储器时使用元数据字段,请检查元数据字符。例如,我正在添加元数据字段,如描述、文件名等。。。。在描述字段中,我有一些垃圾字符,我在运行时字符串文本查看器中找到了这些字符

    我的描述>测试� 文件描述,更改描述“测试文件描述”后。它工作得很好


    我从不同来源提取的元数据值说明了它为什么会有垃圾字符。请删除/修改元数据的值,这样它将正常工作。

    是否尝试使用此SAS URL列出Blob?我只是不想看到AuthenticationFailed错误。我认为它“应该”显示blob列表,尽管我已经给了它列表权限。我没有使用SAS访问我的容器。为什么我会犯同样的错误?刚刚在我的设备上更新了时区并开始工作。问题是我不想依赖时区。我能做什么呢?你是个天才,成功了,我不能告诉你我现在有多高兴,谢谢!:-)当你有时间的时候,我很想听到长时间的答案…我忍不住想知道为什么GetSharedAccessSignature没有包含它需要的位…再次感谢!我明白了,这是有道理的:-)我知道我做错了什么,只是看不出来:-只是更新了我的答案。关于您对SAS未包含必要位的评论,我认为这不是SAS的意图。SAS提供对存储资源的有时间/权限限制的访问。使用此SAS执行什么操作取决于您。这仍然是相关的