尝试为 (Azurite) Azure BLOB 存储生成 SAS URI 时,“服务器无法验证请求”

Dum*_*DED 7 .net c# azure-blob-storage azurite

我已经梳理了这个问题的至少十几个不同版本,但到目前为止,没有一个版本能给出我所遇到的问题的答案。我正在尝试开发一个概念验证,用于使用 Azurite 和具有相应存储帐户密钥的服务 SAS 从 Azure BLOB 存储检索图像。我正在使用众所周知的 Azurite 存储帐户凭据,如此处所示。在 C# 中似乎有无数种方法可以完成此类操作,但我选择宽松地遵循此示例,最终得到如下结果:

public Uri GetSharedKeySasUrl()
{
    BlobServiceClient serviceClient = new BlobServiceClient(
        new Uri("http://127.0.0.1:10000/devstoreaccount1/"),
        new Azure.Storage.StorageSharedKeyCredential(
            "devstoreaccount1",
            "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
        )
    );

    var blobContainer = serviceClient.GetBlobContainerClient("images");

    var blobClient = blobContainer.GetBlobClient("00000-pano.jpg");

    BlobSasBuilder sasBuilder = new BlobSasBuilder()
    {
        BlobContainerName = "images",
        BlobName = "00000-pano.jpg",
        Resource = "b",
        StartsOn = DateTimeOffset.UtcNow,
        ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
    };

    sasBuilder.SetPermissions(BlobSasPermissions.Read);

    Uri sasUri = blobClient.GenerateSasUri(sasBuilder);
    Debug.WriteLine("SAS URI for blob is: {0}", sasUri);

    return sasUri;
}
Run Code Online (Sandbox Code Playgroud)

这会生成一个看起来应该可以正常工作的URL ,但每当我将其粘贴到浏览器并尝试访问它时,我总是会得到以下信息:

<Error>
    <Code>AuthorizationFailure</Code>
    <Message>Server failed to authenticate the request. Make sure the value of the Authorization header is formed correctly including the signature. RequestId:551902dd-ecb8-4736-9cf1-32406d98c02f Time:2022-04-11T20:18:06.368Z</Message>
</Error>
Run Code Online (Sandbox Code Playgroud)

相反,如果我通过 Microsoft Azure 存储资源管理器生成 SAS 签名,则该 URL 可以正常工作。如果我将此 URL 与此方法生成的 URL 进行比较,两者的格式似乎都完美 - 我看不到任何表明我的 URL 格式错误的内容。

Generated by the method:
http://127.0.0.1:10000/devstoreaccount1/images/00000-pano.jpg?sv=2021-04-10&st=2022-04-11T20%3A17%3A59Z&se=2022-04-11T21%3A17%3A59Z&sr=b&sp=r&sig=bUHI2562NmvvtflOqT5kr0E%2BnZv7Q12PlR%2FGNPmEhL8%3D

Generated in Storage Explorer:
http://127.0.0.1:10000/devstoreaccount1/images/00000-pano.jpg?sv=2018-03-28&st=2022-04-11T20%3A06%3A47Z&se=2022-04-12T20%3A06%3A47Z&sr=b&sp=r&sig=V6N7uWDGgoVx8wirM%2FP1ou2kbg05PB4D%2BG8YQdvS5RU%3D
Run Code Online (Sandbox Code Playgroud)

唯一显着的区别似乎是每个人使用的服务版本 - 资源管理器使用2018-03-28而方法使用2021-04-10。我尝试在 BlobSasBuilder 中分配版本,但它只是被忽略,这与 Microsoft 自己关于已弃用的属性的评论一致,并且无论您在此处指定什么,该类始终使用最新支持的服务版本。但我仍然认为这不能解释问题。

有任何想法吗?先谢谢您的帮助。

编辑

我仍然绝望地坚持这一点。我已经多次尝试重新编写用于构建 SAS URI 的代码,希望能有所作为。到目前为止,没有一个有效。我尝试过的方法:

  • 使用BlobUriBuilder,SasBuilderStorageSharedKeyCredential生成 URI
  • 使用 和BlobServiceClientaStorageSharedKeyCredential来导出BlobContainerClientBlobClient然后使用 和SasBuilder来生成 URI
  • 与上面相同,使用连接字符串代替BlobServiceClientaStorageSharedKeyCredential
  • 与上面相同,用作"UseDevelopmentStorage=true"连接字符串BlobServiceClient
  • HMACSHA256使用和 a手动签署字符串NameValueCollection以构造查询参数

我还尝试使用不同的启动选项运行 Azurite,包括azurite --looseazurite --skipApiVersionCheck。两者都没有任何区别。

我尝试过的其他事情:

  • 更新我正在使用的 Azurite 版本
  • 从 Visual Studio 中将 Azurite 作为服务依赖项运行

我简直不明白为什么这是一个如此难以克服的问题。请帮忙。

may*_*ʎɐɯ 8

更新的解决方案:

我已经测试了 Azure.Storage.Blobs 包版本 12.11.0,并给出了问题中描述的确切问题 OP。

将其更改为版本 12.10.0 解决了该问题。

由此得出的结论是,版本 12.11.0 必定是重大更改的副作用或错误。

所以在微软拿出解决方案或者答案之前,解决方案就是使用12.10.0版本。


原答案:

我已经测试了您的代码并且它有效,我没有收到您的错误。我想您要么需要重新安装最新版本的 Azurite,要么按照我的方式进行操作,它对我有用。

为了保证工作的一致性,我使用docker来安装azurite。

我使用 Windows 11 和 Docker Desktop,更多有关安装的信息请查看 Microsoft文档

docker pull mcr.microsoft.com/azure-storage/azurite
Run Code Online (Sandbox Code Playgroud)

然后

docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 -v c:/azurite:/data mcr.microsoft.com/azure-storage/azurite
Run Code Online (Sandbox Code Playgroud)

现在我们已经启动并运行了 docker,我使用 Microsoft Azure Storage Explorer 创建一个 blob 容器并上传图像 00000-pano.jpg(这是一个花图像)。

在此输入图像描述

现在,我获取您的代码而不更改其中的任何内容,并在我的控制台应用程序中使用包引用运行它

<PackageReference Include="Azure.Storage.Blobs" Version="12.10.0" />
Run Code Online (Sandbox Code Playgroud)

运行代码,我得到以下 URL:

http://127.0.0.1:10000/devstoreaccount1/images/00000-pano.jpg?sv=2020-08-04&st=2022-04-20T10%3A47%3A00Z&se=2022-04-20T11%3A47%3A00Z&sr=b&sp=r&sig=RHHe5NJRjhbOjoTeCONqhrRHjjJCygOa8urcwzOWpeE%3D
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我将 URL 复制并粘贴到浏览器中,然后我就得到了花,没有出现身份验证问题:

在此输入图像描述

以下是我的 docker 控制台以及我对图像所做操作的日志:

在此输入图像描述

免责声明:我有一些关于 Azurite 和 docker、使用 Azurite 测试 Azure 代码以及模拟 Azure 存储的文章,这可能会为您的进一步工作增加价值。(https://itbackyard.com/tag/azurite/


Dum*_*DED 5

更新

在向 Azure SDK 团队提交错误后,我发现根据之前 发现的这些问题,该问题的修复实际上正在 Azurite 端进行处理。目前,Azurite 似乎根本不支持 SAS 版本 2020-10-02 及更高版本。对于那些希望使用最新 SAS 版本进行本地开发的人来说,值得关注这一点。

原答案

这是一个版本控制问题。无论出于何种原因,最新版本的 Azure.Storage.Blobs(12.11.0,在撰写本文时)绝对拒绝与 Azurite 一起使用,但版本 12.10.0 工作得很好。

新版本似乎发生了某种重大变化。我已向 SDK 团队提交了一个错误,只是为了增加一些可见性。与此同时,我想我会坚持使用 12.10.0 版本。