Azure 存储 SAS 无法进行身份验证
Posted
技术标签:
【中文标题】Azure 存储 SAS 无法进行身份验证【英文标题】:Azure storage SAS failed to authenticate 【发布时间】:2021-12-17 00:56:49 【问题描述】:您好,我正在尝试为我在 Azure 上的文件创建 SAS 令牌。我收到“服务器无法对请求进行身份验证。确保授权标头的值正确形成,包括签名”错误。以下是我的代码。
public async Task<IActionResult> TestBlobClient()
try
string storageAccount = "myaccount";
string password = "mykey";
var sharedKeyCredential = new StorageSharedKeyCredential(storageAccount, password);
var shareClient = new ShareClient(new Uri("https://aaa.file.core.windows.net/zttsox20201027154501"), sharedKeyCredential);
ShareDirectoryClient directory = shareClient.GetDirectoryClient("Output/14");
ShareFileClient file = directory.GetFileClient("637655759841727494_main.wav");
var shareSasBuilder = new ShareSasBuilder
ShareName = "aaa",
Protocol = SasProtocol.None,
ExpiresOn = DateTime.UtcNow.AddYears(50),
Resource = "b"
;
shareSasBuilder.SetPermissions(ShareFileSasPermissions.Read);
var url = new Uri(file.Uri + "?" + shareSasBuilder.ToSasQueryParameters(sharedKeyCredential).ToString());
return Ok(url);
catch (Exception ex)
return StatusCode(StatusCodes.Status400BadRequest, ex.Message);
【问题讨论】:
【参考方案1】:问题在于Resource = "b"
。当您将资源设置为b
时,这意味着您将获得一个 blob 的 SAS 令牌。考虑到您正在获取文件共享的 SAS 令牌,此参数的值应为 s
。
请尝试以下方法:
var shareSasBuilder = new ShareSasBuilder
ShareName = "zttsox20201027154501",
Protocol = SasProtocol.None,
ExpiresOn = DateTime.UtcNow.AddYears(50),
Resource = "s"
;
更多详情请看此链接:https://docs.microsoft.com/en-us/dotnet/api/azure.storage.sas.sharesasbuilder.resource?view=azure-dotnet#Azure_Storage_Sas_ShareSasBuilder_Resource。
【讨论】:
嗨@Gaurav,我仍然遇到同样的错误。 我刚刚注意到您的共享名称是zttsox20201027154501
而不是 aaa
。我已经更新了我的答案。你能试试吗?
谢谢@gaurav。
嗨@gourav,你能不能帮我只为特定文件设置访问签名。现在,即使资源类型为 f,它也可以设置共享文件夹的访问权限。
您需要使用FilePath
属性。将其添加到 ShareSasBuilder
后,您应该能够仅获得一个文件的 SAS 令牌。 HTH。以上是关于Azure 存储 SAS 无法进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
Azure CDN URL使用令牌身份验证和Blob存储SAS重写规则
Azure sdk for Java 如何设置用户委派密钥和共享身份验证签名 SAS
从 API 身份验证返回的 Azure Blob SAS 网址失败 .net 核心
通过 AzureServiceTokenProvider 对 CloudTableClient 进行 Azure 存储身份验证