Azure 存储:403 服务器无法对请求进行身份验证

Azure Storage: 403 Server failed to authenticate the request

我在此处和 Google 中进行了搜索,但找不到解决方案。

我想使用我的 C# 代码从 Azure 存储 Blob 读取文件。 代码(只有 6 行)在另一个项目(Windows 8.1 Universal App)中运行良好,但在我的新 Windows 10 UWP App 中却不行。

这是我的代码:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("container-name");

CloudBlob b1 = container.GetBlobReference("27.76914.json");
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("stefano1.json", CreationCollisionOption.ReplaceExisting);
await b1.DownloadToFileAsync(file);

异常:

Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.

使用 Fiddler4 我在消息 403 上发现了这个错误:

The MAC signature found in the HTTP request 'R2t9hKsyXf470HF2LNP8T+M2nci0ddE/ojQ0r4UVjJQ=' is not the same as any computed signature

我的尝试:

  1. 应用程序首次运行(下载文件)。第二次我得到异常。
  2. 如果我更改请求的文件名:应用程序第一次运行(下载文件)。第二次我得到异常。
  3. 第二天我立即得到同样的异常(起初运行)
  4. 此外,如果我删除 bin 和 obj 文件夹,我会收到错误消息
  5. 如果我创建另一个应用程序并尝试下载相同的文件(与第 1 点相同),它第一次有效,但第二次无效。
  6. 在控制台应用程序中一切正常。

这是 Fiddler4 原始请求(其中 ***** 是我的 Azure 存储帐户名称):

GET https://*****.blob.core.windows.net/container-name/27.76914.json HTTP/1.1
x-ms-client-request-id: accee7e7-646d-417a-b734-1591cbc16a8d
x-ms-date: Thu, 03 Sep 2015 06:31:37 GMT
x-ms-version: 2015-02-21
User-Agent: WA-Storage/5.0.2 (Windows Runtime)
Authorization: SharedKey *****:R2t9hKsyXf470HF2LNP8T+M2nci0ddE/ojQ0r4UVjJQ=
Host: *****.blob.core.windows.net
If-Modified-Since: Sun, 30 Aug 2015 18:52:41 GMT
If-None-Match: "0x8D2B16C2ED82C4A"
Connection: Keep-Alive

谢谢!

我们的 GitHub 页面上也有报道:https://github.com/Azure/azure-storage-net/issues/171

我们的主要理论是缓存代理可能位于客户端和影响您的请求的服务器之间。

我们仍在调查并会通知您。

我在尝试从本地计算机访问 blob 时遇到了类似的问题(在 Java 中)。 尝试下载一个 blob 会成功两次,而尝试获取一个 InputStream 永远不会成功。在这两种情况下,错误都与您的错误相同。

我的代码总是在云中的虚拟机上运行。 当我将默认协议从 HTTP 更改为 HTTPS 后,问题得到解决。 在构建 CloudStorageAccount 时,有一个构造函数允许您指定默认协议。它也适用于 C# (here)

另请注意,AZCopy 将因 HTTP 源而失败,并出现类似错误。 你可以试一试。