我正在使用Premium/Hot, LRS, StorageV2 Azure存储,并试图写一个简单的字符串,但我一直得到一个认证错误。
要在门户中生成容器的SAS URI,我执行以下步骤:存储资源->容器→我的容器->共享访问令牌->生成SAS令牌和URL
// SAS URI of blob container
var sasUriStr = "https://storageaccountname.blob.core.windows.net/containername?sp=r&st=2021-08-10T00:34:00Z&se=2021-08-15T08:34:00Z&spr=https&sv=2020-08-04&sr=c&sig=ABCDEFGH/YJKLMNOP=";
var uri = new Uri(sasUriStr);
var pageBlobClient = new PageBlobClient(uri);
pageBlobClient.UploadPages(new MemoryStream(Encoding.UTF8.GetBytes("hello world")), 0);
未处理的例外。Azure。RequestFailedException:服务器失败验证请求。确保授权头的值格式正确,包括签名。时间:2021-08-12T20:22:44.0905117Z状态:403(服务器失败验证请求。确保授权头的值格式正确,包括签名。错误代码:AuthenticationFailed
附加信息:AuthenticationErrorDetail: Signature did not匹配。要使用的字符串为r
我感谢任何帮助或提示。谢谢你更新:
添加/blob名称到SAS URI后,我得到这个错误:
Unhandled exception. Azure.RequestFailedException: The value for one of the HTTP headers is not in the correct format. RequestId:7a741951-401c-00c9-3ce3-8f5076000000 Time:2021-08-13T01:38:13.4585107Z Status: 400 (The value for one of the HTTP headers is not in the correct format.) ErrorCode: InvalidHeaderValue Additional Information: HeaderName: x-ms-range HeaderValue: bytes=0-10 Content: <?xml version="1.0" encoding="utf-8"?> <Error><Code>InvalidHeaderValue</Code><Message>The value for one of the HTTP headers is not in the correct format. RequestId:7a741951-401c-00c9-3ce3-8f5076000000 Time:2021-08-13T01:38:13.4585107Z</Message><HeaderName>x-ms-range</HeaderName><HeaderValue>bytes=0-10</HeaderValue></Error> Headers: Server: Windows-Azure-Blob/1.0,Microsoft-HTTPAPI/2.0 x-ms-error-code: InvalidHeaderValue x-ms-request-id: 7a741951-401c-00c9-3ce3-8f5076000000 x-ms-version: 2020-08-04 x-ms-client-request-id: 4366d771-7f70-4bbf-9677-6e9fcf3cb7a1 Date: Fri, 13 Aug 2021 01:38:12 GMT Content-Length: 327 Content-Type: application/xml
解决方案
请将您的代码更改为:
var sasUriStr = "https://storageaccountname.blob.core.windows.net/containername?sp=r&st=2021-08-10T00:34:00Z&se=2021-08-15T08:34:00Z&spr=https&sv=2020-08-04&sr=c&sig=ABCDEFGH/YJKLMNOP=";
var uri = new Uri(sasUriStr);
BlobContainerClient containerClient = new BlobContainerClient(uri);
var pageBlobClient = containerClient.GetPageBlobClientCore("page-blob-name");
pageBlobClient.UploadPages(new MemoryStream(Encoding.UTF8.GetBytes("hello world")), 0);
请确保在使用此代码之前blob已经存在。
你遇到这个问题的原因是因为你试图使用一个表示blob容器SAS的URI创建一个PageBlobClient
。因此,Azure存储服务假定您的blob名称为containername
,容器名称为$root
。由于SAS令牌是为containername
blob容器获得的,并且服务使用$root
blob容器验证SAS令牌,因此您将获得授权失败错误。
通过使用SAS URL创建BlobContainerClient
,然后使用BlobContainerClient.GetPageBlobClientCore(String)
创建PageBlobClient
来解决这个问题。