我有一个私有的 azure 存储容器,并且正在尝试 azure 存储 SAS,以便我可以上传和下载文件。
我能够生成签名,但它总是向我抛出身份验证失败错误
AuthenticationFailed
服务器无法验证请求。确保授权标头的值格式正确,包括
签名。请求 ID:a9dce486-0001-0021-23f7-d8f6dc000000
时间:2017-05-30T03:45:56.6617677Z
签名不匹配。使用的签名字符串是 r 2017-05-30T03:40:48Z 2017-05-30T03:55:48Z
/blob/{myaccount}/{mycontainer}/11e1575f-d3ad-40cc-b1ce-32e24dc20324.jpg
2016-05-31
这是我的代码,它生成一个签名供我使用,并返回访问该文件的完整 URI。
var accountAndKey = new StorageCredentials("******", "*********************");
var storageAccount = new CloudStorageAccount(accountAndKey, true);
var sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5);
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10);
sasConstraints.Permissions = SharedAccessBlobPermissions.Read;
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("*****");
CloudBlockBlob blockBlob = container.GetBlockBlobReference("11e1575f-d3ad-40cc-b1ce-32e24dc20324.jpg");
var sasBlobToken = blockBlob.GetSharedAccessSignature(sasConstraints);
var sas = blockBlob.Uri + sasBlobToken;
return sas;
这是它生成的签名
?sv=2016-05-31&sr=b&sig=9fUwDWfdtUifv9iZXJKgILEM7Yx1uP3Ku0vrspjWyz8%3D&st=2017-05-30T03%3A40%3A43Z&se=2017-05-30T03%3A55%3A43Z&sp =r
我使用 Azure 门户生成签名,效果很好。我附加它并能够像往常一样下载该文件。
这是它生成的签名
?sv=2016-05-31&ss=b&srt=sco&sp=r&se=2017-05-30T03:57:25Z&st=2017-05-30T03:52:25Z&spr=https&sig=JOnhkge0QWNdv8sXJjb5GazTo9c34KH1IvZBvcNgjHo%3 D
我高度怀疑这是时间戳问题。因为我可以看到从代码生成的时间戳与从门户生成的时间戳之间存在一些差异。
任何想法都非常感激。谢谢。
EDIT我更新了代码以添加一天直到到期并删除了开始时间,这是现在的签名
?sv=2016-05-31&sr=b&sig=73m3%2Bj%2BUsFk537vd8a7F%2BdpdON1Pg2RZ1IRynMH4zGA%3D&se=2017-05-31T06%3A12%3A07Z&sp=r
但它仍然不允许我下载该文件。同样的错误消息。
签名不匹配。使用的签名字符串为 r 2017-05-31T06:12:07Z /blob/{MyAcc}/{My Container}/11e1575f-d3ad-40cc-b1ce-32e24dc20324.jpg 2016-05-31