Azure 服务器未能对请求进行身份验证。确保授权标头的值格式正确,包括签名

Posted

技术标签:

【中文标题】Azure 服务器未能对请求进行身份验证。确保授权标头的值格式正确,包括签名【英文标题】:Azure Server failed to authenticate the request. Make sure the value of the authorization header is formed correctly including the signature 【发布时间】:2021-09-19 00:52:38 【问题描述】:

enter code here我正在尝试使用 javascript 下载存储在 azure blob 中的文件并收到此错误。

这是我的代码

function getUrlOfAttachmentFileFromBlob(new_fileurl,new_fileName) 
  var fileHyperlink = '';
  var blobUri = 'https://' + 'Storage_Account_Name' + '.blob.core.windows.net';
  var containerName = 'trial';
  var sas_token = 'sastoken' ;
    
  var blobService = AzureStorage.Blob.createBlobServiceWithSas(blobUri, sas_token);
  //.withFilter(new AzureStorage.Blob.ExponentialRetryPolicyFilter());

  var downloadLink = blobService.getUrl(new_fileName, new_fileurl.replace('/'+containerName+'/',''), sas_token);

  if (downloadLink != null)
  
      alert("Link " + downloadLink);
      downloadURI(downloadLink, new_fileName);
  

我没有在这里生成共享签名和 sas 令牌。我直接将 sas 令牌分配给变量。

当我尝试在浏览器中打开链接时出现此错误

AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:504f2ef5-f01e-0021-0e02-74e194000000
Time:2021-07-08T14:09:47.9951927Z</Message><AuthenticationErrorDetail>sp is mandatory. Cannot be empty</AuthenticationErrorDetail></Error>

我没有在我的代码中传递任何标题。

我在这里缺少什么?

SAS 令牌 = ?sp=r&st=2021-07-08T12:19:08Z&se=2021-07-08T20:19:08Z&spr=https&sv=2020-02-10&sr=c&

没有签名部分。

这就是我从 geturl 函数得到的结果 =

?%3Fsv=2020-02-10&ss=bfqt&srt=sco&sp=rwdlacuptfx&se=2021-07-11T12%3A30%3A23Z&st=2021-06-11T04%3A30%3A23Z&spr=https%2chttp&

我想我没有从这个函数中得到正确的 url,所以我用这个替换了那行

const downloadLink = blobUri +'/' + containerName + '/' + new_fileName + sas_token;

但仍然无法下载文件。但没有收到身份验证错误。

谢谢...

【问题讨论】:

您是否确保 Authorization 标头的值格式正确,包括签名? @RobertHarvey - 错误详细信息中的授权标头部分有点误导:)。问题仅与 SAS 令牌有关。我已经提供了这个答案。 这能回答你的问题吗? AzureStorage Blob Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature 【参考方案1】:

您收到此错误的原因是您的 SAS 令牌无效。如果您仔细查看错误消息,您将看到以下内容:

<AuthenticationErrorDetail>sp is mandatory. Cannot be empty</AuthenticationErrorDetail>

基本上您的 SAS 令牌缺少 signed permissions (sp) 参数。请检查您的 SAS 令牌并确保其格式正确。

【讨论】:

我提供了正确的 sas 令牌。但是我没有从 Azure blob 存储库中的这个函数获得正确的 sas 令牌。 var downloadLink = blobService.getUrl(new_fileName, new_fileurl.replace('/'+containerName+'/',''), sas_token); 您能否编辑您的问题并包含 SAS 令牌?您可以混淆 SAS 令牌的 sig 部分。 也分享下载链接。 我已经编辑了我的问题,包括 sas 令牌。谢谢 谢谢。您的 getUrl 函数肯定有问题。这是您编写的自定义函数吗?我不记得 SDK 中有这个功能。

以上是关于Azure 服务器未能对请求进行身份验证。确保授权标头的值格式正确,包括签名的主要内容,如果未能解决你的问题,请参考以下文章

AzureStorage:服务器未能对请求进行身份验证。确保 Authorization 标头的值正确形成,包括签名

Azure 存储 SAS 无法进行身份验证

对 C# 中的每个请求强制进行 Azure 重新身份验证

如何使用应用服务对 Azure Functions 应用进行身份验证/授权?

Azure - 使用服务主体对 Key Vault 进行身份验证返回未经授权的异常

如何对 Azure AD 中特定区域的用户进行身份验证和授权?