AzureStorage Blob服务器无法验证请求。确保正确形成Authorization标头的值,包括签名

时间:2014-06-30 14:43:53

标签: azure blob

我正在尝试在Windows Azure Blob中上传图片,而我正在发现以下错误,我无法处理。

  

服务器无法验证请求。确保正确形成Authorization标头的值,包括签名。

尝试创建容器时发生错误。

   container.CreateIfNotExists()

这是我的代码

 try
            {
                Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);
                CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();


                // Retrieve a reference to a container. 
                CloudBlobContainer container = blobClient.GetContainerReference("samples");

                // Create the container if it doesn't already exist.
                //here is the error
                if (container.CreateIfNotExists())
                {
                    container.SetPermissions(
                        new BlobContainerPermissions
                        {
                            PublicAccess =
                                BlobContainerPublicAccessType.Blob
                        });
                }
                CloudBlockBlob blockBlob = container.GetBlockBlobReference("Image1");
                using (var fileStream = System.IO.File.OpenRead(@"Path"))
                {
                    blockBlob.UploadFromStream(fileStream);
                }
            }
            catch (StorageException ex1)
            {
                throw ex1;
            }

我在代码中尝试了很多选项,但仍然遇到错误。

任何人都可以帮助我吗? 感谢。

16 个答案:

答案 0 :(得分:3)

根据评论中的其他人的建议,我的电脑的时间减少了1小时。纠正它解决了这个问题。

答案 1 :(得分:2)

以Azure App Service的身份运行时,即使连接字符串与在本地计算机上进行开发时使用的连接字符串完全相同,我的Web应用程序也无法访问表存储。

为解决此问题,我向我的Azure应用服务添加了系统分配的身份,并在存储帐户中赋予了存储帐户贡献者角色。

该应用程序是使用.NET库 WindowsAzure.Storage版本9.3.2 的.NET Core 3.1。

Add System assigned identity to Azure App Service Assign Storage Account Contributor role to Store Account

答案 2 :(得分:2)

错误消息


服务器无法验证请求。确保包括签名在内的Authorization标头的值正确形成。

解决方案


我在应用程序中遇到了同样的问题,我通过为key2而不是key1生成共享访问签名(在Azure门户中)来解决了这个问题。更改密钥可修复错误。 (设置>共享访问签名) 还请记住,连接字符串也应更新(如果使用)。 (设置>访问键)

答案 3 :(得分:1)

(python) 我在使用 SAS 令牌的资源 GET 请求上遇到了同样的错误,但是当尝试通过本地机器(python、浏览器等)进行 GET 时,它总是工作正常。 我看到了 @gmaklari's@user2243747 评论,这让我想到了 use requests lib instead of urlretrieve(我最初的意图是向请求添加标头)。 它现在工作正常。不必添加任何标题。

答案 4 :(得分:0)

当我尝试通过REST API端点访问BLOB存储时收到此消息。

以下是我使用Authorization标头调用列表容器操作时得到的响应

<?xml version="1.0" encoding="utf-8"?>
<Error>
    <Code>AuthenticationFailed</Code>
    <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:096c6d73-f01e-0054-6816-e8eaed000000
Time:2019-03-31T23:08:43.6593937Z</Message>
    <AuthenticationErrorDetail>Authentication scheme Bearer is not supported in this version.</AuthenticationErrorDetail>
</Error>

解决方案是在标题下方添加

x-ms-version: 2017-11-09

答案 5 :(得分:0)

检查计算机或手机的时区。

答案 6 :(得分:0)

在我的情况下,

实际上是过期的共享访问签名(SAS)。通过在未来添加结束日期的一年(或更多)来更新(实际上是制作一个新的)portal.azure.com中的共享访问签名。并解决了所有问题。

答案 7 :(得分:0)

在我的情况下,我将带有访问签名的存储连接字符串作为参数传递给控制台应用程序。命令行中的“%”是特殊字符“命令行参数”。 “%”出现在访问签名(SAS)中。您必须逃脱%%,将其%%翻倍。

答案 8 :(得分:0)

我正在使用.NET SDK通过Azure元数据上传Azure blob文件。将文件与元数据上传到Azure Blob存储时出现错误,错误是“ 服务器无法验证请求的身份。请确保正确形成包括签名的授权标头的值。” 但是这些错误只是少数几个文件而不是全部。

如果您有文件的元数据,则元数据不应包含特殊字符(。)或值的开头和结尾的空格(

)。

如果您更正了元数据值,则文件将成功上传。

答案 9 :(得分:0)

我将一个应用程序从一台计算机迁移到另一台计算机,并在整个连接字符串之间进行迁移。 公用IP保持不变,URL尚未过期,但是我收到了此错误。

似乎曾经使用过连接字符串URL绑定到该计算机-也许在首次使用时添加了其他指纹。

我没有任何证据,但是在生成新的连接字符串后它就起作用了。

答案 10 :(得分:0)

我遇到了同样的错误,但是真正奇怪的是,我在运行某些代码的3个存储帐户中有2个遇到了错误。对我而言,解决此问题的方法是将Azure.Storage.Files.DataLake库更新为预览版本12.2.2。这解决了问题。尝试了所有其他建议,时间同步等。所有建议均无效。真的很奇怪。

答案 11 :(得分:0)

在本地进行调试,但连接到远程azure存储器并出现此错误,请检查您的AzureWebJobsStorage中的local.settings.json字符串是否为最新。似乎有多种原因会导致这种情况发生,这就是其中之一。

答案 12 :(得分:0)

在我的情况下(python),必须将上传内容从字符串编码为字节。不知道为什么错误消息会这样说:

azure.core.exceptions.ClientAuthenticationError: 
Server failed to authenticate the request. 
Make sure the value of Authorization header is formed correctly including the signature.

这是起作用的。

版本:

$ python -V
Python 3.7.7
$ pip list | grep azure
azure-core               1.8.1
azure-storage-blob       12.4.0

和要上传的python函数:

def upload_blob(blob_service_client, content: str, container_name, blob_name):
    blob_client = blob_service_client.get_blob_client(container_name, blob_name)
    try:
        content_bytes = content.encode('utf-8')
        blob_client.upload_blob(content_bytes)
        return True
    except Exception as e:
        logger.error(traceback.format_exc())
        return False        

答案 13 :(得分:0)

我有同样的错误。存储连接在本地调试时有效,但在Azure应用服务上部署时则无效。我之前删除了一个具有相同名称的存储帐户,并在其他Azure订阅上重新创建了该帐户。 Azure中是否可能存在错误,以至于即使资源名称再次可用,它在Azure内还是没有“正确释放”,这意味着什么?

当我使用其他名称创建存储帐户时,再也没有收到错误消息。

答案 14 :(得分:0)

当尝试从简单的Azure AppService连接到存储帐户时,我们遇到了相同的错误。 经过大量调查,我们要求官方Microsoft支持提供帮助。 他们检查了我们在Azure中的资源和基础结构,并指出该问题与Application Insights有关,这是官方的答案:

请求中还有一个附加标头“ x-ms-request-root-id” 在对授权标头进行签名以进行存储后添加 客户要求。结果,当请求由 Azure Storage结果为403。 如果启用了依赖项跟踪,则为Application Insights。

因此,在/dev/wwwroot/ApplicationInsights.config中禁用依赖项跟踪之后,错误消失了,AppService可以毫无问题地连接到存储帐户。

答案 15 :(得分:0)

如果您在使用 PUT 请求时看到此错误,请确保在 URL 中提供新的 blob 名称。

https://{storageAccount}.blob.core.windows.net/{containerName}/{**NEW BLOB NAME TO CREATE**}?{SAS Token}