【问题标题】:azure blob returns 403 forbidden with correct access keyazure blob 使用正确的访问密钥返回 403 禁止
【发布时间】:2017-11-07 16:11:35
【问题描述】:

我的测试站点在尝试从 azure blob 存储访问文件时,在部署开始后出现 403 被禁止返回。 这只是我们测试环境的一个问题,新版本在生产中运行良好。生产和测试都托管在 Azure 中,并且都使用自己的 Azure Blob 存储。

我尝试重新生成 blob 存储的访问密钥,但没有任何运气。
我可以在本地使用访问密钥并连接到测试 blob 存储并正常访问文件。
如果我尝试更改测试环境以使用生产 blob 存储,我仍然会收到 403 禁止错误。

Microsoft.WindowsAzure.Storage.StorageException:远程服务器 返回错误:(403)禁止。 ---> System.Net.WebException: 远程服务器返回错误:(403)禁止。在 System.Net.HttpWebRequest.GetResponse() 在 Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:line 677 --- End of inner exception stack trace --- at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand1 cmd, IRetryPolicy 策略, OperationContext operationContext) 中 c:\程序文件 (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:line 604 在 Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient.GetBlobReferenceFromServer(StorageUri blobUri、AccessCondition accessCondition、BlobRequestOptions 选项、 C:\Program Files 中的 OperationContext operationContext) (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlobClient.cs:line 563 在 Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.GetBlobReferenceFromServer(字符串 blobName、AccessCondition accessCondition、BlobRequestOptions 选项、 C:\Program Files 中的 OperationContext operationContext) (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlobContainer.cs:line 818 at ASP.XYZ in d:\XYZ.cshtml:line 27 请求信息 请求 ID:fc137321-0001-00ce-02d2-de5736000000 请求日期:6 月 6 日,星期二 2017 14:41:21 GMT StatusMessage:服务器未能验证 要求。确保 Authorization 标头的值已形成 正确包括签名。

这一定是运行测试站点的 azure app 服务的问题。我只是看不出它可能是什么。

请参阅此处的要点以获取一些非常简化的代码https://gist.github.com/Skaanning/5cddf95a0d1ff210482d99a683e0be9c

编辑 我有多个其他 blob 商店,但它们都没有在测试站点上工作。但它们在其他环境中也能正常工作。

我尝试放大和缩小它,但没有任何运气。但是后来我尝试从 32 位更改为 64 位,现在它可以工作了!我会保持这个问题,以防有人可以解释这里到底发生了什么

【问题讨论】:

  • 两个存储帐户/容器的配置是否相同?特别是在容器级别,它们是否具有相同的访问策略?另外,“blob.storage”中的内容是密钥还是连接字符串?
  • blob.storage 是来自 web.config 的连接字符串。它一直工作得很好,直到它突然没有了。他们都有 blob 访问策略

标签: azure azure-blob-storage


【解决方案1】:

我的解决方法是 - 将访问级别更改为 Blob,而不是容器

【讨论】:

  • 嗨,Serge,欢迎来到 StackOverflow!我建议你看看how to write a good answer,这样你就可以确保大多数人都能从中受益!
【解决方案2】:

我尝试了两个访问密钥中的另一个,它起作用了。

【讨论】:

    【解决方案3】:

    我的服务器时间错误,不知何故我的应用程序将时间设置回 1 小时 20 分钟,这将导致 403,我推测来自 azure blobstorage 的授权使用服务器时间进行身份验证。

    至少将时间设置回正确对我有用。

    【讨论】:

    • 当我的 PC 时钟关闭一个多小时时,在我的本地计算机上遇到了这个问题。更正时钟后,403 问题消失了。
    【解决方案4】:

    查看您的服务器日期时间。这对我有用。

    【讨论】:

      【解决方案5】:

      我遇到了同样的错误,唯一解决该错误的方法是将平台从任何 cpu 切换到 x64。这是什么巫术?

      然后我改回“任何 CPU”,这次手动删除了所有本地文件,而不是使用 Visual Studio 中的重建或清理。从干净重建,我不再得到 403。

      【讨论】:

        【解决方案6】:

        var img = container.GetBlobReference("someimage.png"); // 这工作得很好
        var img2 = container.GetBlobReferenceFromServer("someimage.png"); // 这会抛出 403

        第一行可以正常工作。原因是当我们执行 GetBlobReference 方法时它不会向服务器发送请求。执行 GetBlobReferenceFromServer 方法时,它会向服务器发送请求以获取 blob 内容。如果在 blob 服务器中找不到 blob,则会抛出 404 not found 异常。

        我的测试站点在尝试从 azure blob 存储访问文件时,在部署开始后出现 403 被禁止返回。

        使用了经常由错误的访问密钥引起的 403 禁止异常。请打印出您的测试环境中使用的连接字符串。

        Trace.Write(CloudConfigurationManager.GetSetting("blob.storage"));
        

        Azure 存储连接字符串使用以下格式。请确保您为连接字符串提供了正确的帐户名和密钥对。如果你为account name2设置了account name1和account key,会导致异常。

        DefaultEndpointsProtocol=https;AccountName=[accountName];AccountKey=[accountKey];EndpointSuffix=core.windows.net
        

        导致此问题的另一件事是测试服务器拒绝了对存储服务器的请求。请检查您的web.config中是否配置了Dynamic IP Security

        编辑 2017/6/7 下午 4:26

        我建议你采纳我的上级建议。请在运行时打印出连接字符串。如果在 Azure 门户和 web.config 的应用设置中设置连接字符串。 Azure 门户中的设置将覆盖 web.config 中的设置。

        还请在运行时打印出当前日期时间,以检查您的应用实例的系统时间是否正确。如果您的系统的日期或时间已更改,404 Forbidden 也会发生。

        存储服务确保请求到达服务的时间不超过 15 分钟。这可以防止某些安全攻击,包括重放攻击。当此检查失败时,服务器返回响应码 403(禁止)。

        参考:Authentication for the Azure Storage Services

        编辑 2017/6/7 下午 5:55

        在部署版本时,您是否尝试过删除测试服务器上的所有原始文件?

        【讨论】:

        • 嗨。连接字符串是正确的。我可以在本地机器上很好地使用它们。我也尝试过重新生成密钥并改用新密钥 - 没有任何运气。我们没有设置 dynamicIpSecurity,但我们确实设置了 ipSecurity allowUnlisted=false,它只允许一组特定的 IP。很长一段时间以来,这在任何版本中都没有改变。
        • 您使用哪个 Azure 服务来托管您的 Web 应用程序? Azure Web 应用程序或云服务或 Azure VM?
        • 它是一个应用服务,输入web app
        • 我尝试放大和缩小它,但没有任何运气。但是后来我尝试从 32 位更改为 64 位,现在它可以工作了!我会保持这个问题,以防有人可以解释这里到底发生了什么
        • 我遇到了同样的问题,从任何 cpu 切换到 x64 都能正常工作。
        猜你喜欢
        • 1970-01-01
        • 2014-09-03
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多