![](/img/trans.png)
[英]Azure Blob Storage Shared Access Signature (SAS) - Signature did not match
[英]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
是必需的。
在花费大量时间后,实际错误不同于.net编译器引发的异常。 如果您在将Blob文件上传到存储设备时使用元数据字段,请检查元数据字符。 例如,我要添加元数据字段,例如描述,文件名等。...在描述字段中,我有一些垃圾字符,并且在运行时字符串文本查看器中发现了这些字符。
更改描述“测试文件描述”后,我的描述最初>测试文件描述。 一切正常。
我从不同的来源提取的元数据值为何会出现那些垃圾字符。 请删除/修改元数据的值,然后它将正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.