【问题标题】:Azure Storage: 403 Server failed to authenticate the requestAzure 存储:403 服务器无法对请求进行身份验证
【发布时间】:2015-11-28 14:18:48
【问题描述】:

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

我想使用我的 C# 代码从 Azure 存储 Blob 读取文件。 该代码(仅 6 行)在另一个项目(Windows 8.1 通用应用程序)中运行良好,但在我的新 Windows 10 UWP 应用程序中运行良好。

这是我的代码:

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);

例外情况:

服务器未能验证请求。确保值 包括签名在内的授权标头格式正确。

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

在 HTTP 请求“R2t9hKsyXf470HF2LNP8T+M2nci0ddE/ojQ0r4UVjJQ=”中找到的 MAC 签名与任何计算的签名都不相同

我的尝试:

  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

谢谢!

【问题讨论】:

  • 能否请您发布您在 Fiddler 中看到的原始请求。
  • 由于我在 UWP 应用中遇到了同样的问题,您对此问题是否有任何解决方案?
  • 不,我仍在等待解决方案。我的临时解决方法是我的 UWP 应用程序和 Azure Blob 之间的 Web 服务桥梁(因为我处于测试阶段)。所以我的 UWP 应用使用 Azure Blob Storage API 上传和列出 Blob,但使用我的自定义 Web 服务下载它们。
  • 是的,这就是 IoT-core/UWP 用户目前的困境。您可以(自担风险)使用存储客户端库进行上传,但必须将 REST API 添加到服务以供下载,直到支持客户端库为止。见stackoverflow.com/questions/34594757/…

标签: c# azure azure-blob-storage uwp


【解决方案1】:

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

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

我们仍在调查中,会通知您。

【讨论】:

  • 总的来说,我们实际上还不支持 Windows 10 通用应用程序,这就是为什么我们还没有太多信息的原因。 :)
  • 谢谢你,彼得,我没有看到那个页面。希望您能找到解决方法。
  • 好的,所以我现在可以确认 UWP 代码中有某种缓存机制在起作用,即使连接使用 HTTPS 也是如此。我们将不得不进行更多调查,但这可能需要对我们进行某种代码更改——不幸的是,这可能意味着这将在短期内属于“目前不支持 UWP”的范畴.希望我们能够确定问题并为即将发布的版本提出修复。再次感谢您的错误报告。
  • 嗨@PeterMarino-MSFT 是否有任何关于 UWP 问题的更新,因为我遇到了完全相同的错误。谢谢
  • 看起来我遇到了同样的问题stackoverflow.com/questions/34594757/… 有趣的是,它工作了一段时间,然后就退出了:告诉我它是哪个缓存:-)! ...所以我可以删除它并让它再次工作。不,说真的,我非常感谢这里的修复或明确的答案。如果无法修复,那么我将不得不撕掉很多存储库代码......
【解决方案2】:

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

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

另外作为记录,AZCopy 对于 HTTP 源将失败,并出现类似错误。 你可以试一试。

【讨论】:

  • 这有点不同,但感谢您的建议!始终建议使用 HTTPS。
猜你喜欢
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2020-01-29
  • 2021-08-23
  • 2014-09-19
  • 2020-08-23
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多