Azure Blob:服务器无法验证请求确保正确构成Authorization标头的值包括签名

问题描述

有人可以帮助我吗?在存储模拟器中使用SAS令牌访问blob容器时遇到错误-

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

System.AggregateException:发生一个或多个错误。 (服务器失败 验证请求。确保授权值 标头格式正确,包括签名。 RequestId:c3d554bf-ae0c-413d-ba15-ef888f141864 时间:2020-08-19T08:18:01.6796671Z状态:403(服务器失败 验证请求。确保授权标头的值 包括签名在内的格式正确。)ErrorCode: 验证失败

标头:服务器:Microsoft-HTTPAPI / 2.0 x-ms-request-id: c3d554bf-ae0c-413d-ba15-ef888f141864 X-MS-错误代码: 身份验证失败日期:2020年8月19日,星期三,格林尼治标准时间 内容长度:498内容类型:application / xml **

预期行为是什么?

以下是“异常”或“堆栈跟踪”详细信息- ---> Azure.RequestFailedException:服务器无法验证请求。确保形成了Authorization标头的值 正确包含签名。 RequestId:0b506bfc-ba50-4519-924f-6072c5ba829d 时间:2020-08-19T08:47:57.3367759Z状态:403(服务器无法 验证请求。确保授权标头的值 包括签名在内的格式正确。)ErrorCode: 验证失败

标头:服务器:Microsoft-HTTPAPI / 2.0 x-ms-request-id: 0b506bfc-ba50-4519-924f-6072c5ba829d x-ms-错误代码: 身份验证失败日期:2020年8月19日星期三08:47:57 GMT 内容长度:498内容类型:application / xml

在 Azure.Storage.Blobs.BlobRestClient.Service.GetPropertiesAsync_CreateResponse(ClientDiagnostics clientDiagnostics,响应响应)在 Azure.Storage.Blobs.BlobRestClient.Service.GetPropertiesAsync(ClientDiagnostics clientDiagnostics,HttpPipeline管道,Uri resourceUri,字符串 版本,Nullable`1超时,字符串requestId,布尔异步,字符串 operationName,CancellationToken cancelToken)在 Azure.Storage.Blobs.BlobServiceClient.GetPropertiesInternal(Boolean 异步,在 Azure.Storage.Blobs.BlobServiceClient.GetPropertiesAsync(CancellationToken cancelToken)

我指的是示例示例-https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/samples/Sample02_Auth.cs

下面是要复制的代码-

BlobSasBuilder sasBuilder = new BlobSasBuilder {
BlobContainerName = "myTestContainer",Resource = "c",//StartsOn = DateTimeOffset.UtcNow,//ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
ExpiresOn = DateTimeOffset.MaxValue
};  
//Allow read access
        sasBuilder.SetPermissions(BlobContainerSasPermissions.Read);
        
        StorageSharedKeyCredential credential =
            new StorageSharedKeyCredential("Eby8vdM02xNOcqFlqUwjpllmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==","devstoreaccount1");

        // Use the key to get the SAS token.
        string sasToken = sasBuilder.ToSasQueryParameters(credential).ToString();

        Console.WriteLine("SAS for blob container is: {0}",sasToken);
        Console.WriteLine();

        // Build a SAS URI
        UriBuilder sasUri = new UriBuilder(containerClient.Uri);
        sasUri.Query = sasToken;

        // Create a client that can authenticate with the SAS URI
        BlobServiceClient service = new BlobServiceClient(sasUri.Uri);
        
         // Make a service request to verify we've successfully authenticated
        await service.GetPropertiesAsync(); //Note - Receiving above error while calling this function

解决方法

请更改

        StorageSharedKeyCredential credential =
            new StorageSharedKeyCredential("Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==","devstoreaccount1");

            StorageSharedKeyCredential credential =
                new StorageSharedKeyCredential("devstoreaccount1","Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==");