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 存储身份验证

如何从 Azure 容器应用服务向 Azure ACR 进行身份验证

基于身份的身份验证不适用于 Azure 存储文件共享