C#学习教程:Azure上的访问被拒绝,存储2.0的共享访问签名如果(blob.Exists()){varexpires=DateTime.UtcNow.AddMinutes(30);varsas=blob.GetSharedAccessSignature(newMicrosoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy{Permissions=Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Read,SharedAccessExpiryTime=expires});url=string.Concat(blob.Uri.AbsoluteUri,sas);}返回网址;但是,如果我调试会话并将URL粘贴到浏览器中,我会收到错误消息:AuthenticationFailed服务器无法验证请求。确保授权标头的值格式正确,包括签名。RequestId:c1a1dd2b-bf4a-4a6b-bab2-ab1cb9363d27时间:2012-11-19T14:41:51.12543用于签名的字符串是r2012-11-19T15:11:36Z/container/path/1356/pic.jpg2012-02-12谁能帮忙?更新:生成的URL如下所示:https://storageaccountname.blob.core.windows.net/container/path/1356/pic.jpg?id=1sv=2012-02-12&SE=2012-11-19T19%3A25%3A32Z&sr=b&sr=r&sig=s6qidwagy4xc8fs4l9pk8hagiy%2f8x58aqbcbcfbefbejypdm%3Di在ifortotoin2.0:varrarednewtime=0:varcerredweedcers=0:varcersnewtercy=0:varc.0:,SharedAccessExpiryTime=DateTime.UtcNow.AddMinutes(30),Permissions=SharedAccessBlobPermissions.Read};varsharedAccessSignature=_blockblob.GetSharedAccessSignature(sharedAccessPolicy);返回urblockblob.Uri.AbsoluteUri+共享http://127.0.0.1:10000/devstoreaccount1/original/c04d2a1c-980b-42c5-b76e-b71185f027b6.jpg?sv=2012-02-12&st=2012-11-20T08%3A30%3A24Z&se=2012-11-20T09%3A10%3A24Z&sr=b&sp=r&sig=9%2BVg6mSGqyrfr5rPlNJ6GSv%2BHN3J9k%2FWFRLYmx3xCvQ%3D更新,已解决:在上面的代码中,我有_blockBlob。这是在构造函数中设置的varblobClient=account.CreateCloudBlobClient();varcontainer=blobClient.GetContainerReference(containerName);CloudBlockBlob_blockblob=container.GetBlockBlobReference(文件名);将最后一行(由clausndk建议)更改为ICloudBlob_test=container.GetBlobReferenceFromServer(fileName);解决了这个问题,因为在_test上调用GetSharedAccessSignature会产生不同的(有效的)签名。查看AzureStorage的源代码并在我的应用程序上使用调试器,我找到了问题的原因。在我的代码中,我有一个带有尾部斜杠的containerName(原始/)。除了GetSharedAccessSignature之外,这不是问题。此处额外的斜杠混淆了canonicalName(在代码中添加一个斜杠会产生双斜杠),从而使签名无效。GetBlobReferenceFromServer工作的原因是它向服务器(通过RESTAPI)询问blob,并且生成的CloudBlockBlob删除了斜杠。在我的代码中,我删除了斜杠,但SandrinoDiMattia使用.Trim('/')的解决方案也适用于容器名称。我认为这比使用GetBlobReferenceFromServer更可取,因为它会导致额外的服务器调用。希望CloudBlockBlobBase中GetCanonicalName的实现将来会改变以处理尾部斜杠(我为此在GitHub上创建了一个问题),但目前这个“解决方法”有效。你可以试试下面的代码吗?varpathToMyBlob="/path/1356/pic.jpg";varblob=container.GetBlockBlobReference(pathToMyBlob.TrimStart('/'));varexpires=DateTime.UtcNow.AddMinutes(30);varsas=blob.GetSharedAccessSignature(newMicrosoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy{Permissions=Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Read,SharedAccessExpiryTime=expires});查看第二行,特别是对TrimStart的调用。在尝试获取路径以斜杠开头的文件的blob引用时,我能够重现该问题。通过删除斜杠,问题就解决了。所以:以上就是C#学习教程的全部内容:Azure,Storage2.0的共享访问签名。收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
