使用含容器名和SAS Token的连接字符串上传Blob时遇AuthenticationFailed错误
问题描述
- 使用NuGet包:
Azure.Storage.Blobs版本12.14.1 - 容器级SAS URI:
https://my-storage.blob.core.windows.net/my-container?sv=2018-03-28&sr=c&sig=DZSbKgaKd%2FjYQbYQf7eOAZ%2BVFSY1Rq2M7HIVXs%2F%2BPtA%3D&se=2023-02-12T04%3A08%3A07Z&sp=rcwl - 上传代码:
var blobClient = new BlobClient(new Uri(connectionString)); await using var fileStream = entry.Open(); await blobClient.UploadAsync(fileStream, true);
- 报错信息:
AuthenticationFailed
服务器无法验证请求。请确保Authorization标头的值格式正确,包括签名。
附带信息:RequestId:5a7b1650-501e-001d-7ed2-3d2845000000,Time:2023-02-11T04:35:40.8903035Z,签名不匹配。使用的签名字符串是rcwl。
解决办法
问题出在SAS URI的使用方式错误,容器级SAS需要配合正确的客户端实例或完整Blob路径来操作单个Blob,具体两种修复方式:
方式一:构造完整的Blob URI
将容器SAS URI拼接上具体的Blob文件名,再创建BlobClient:
// 拼接Blob名称到容器SAS URI后 var blobUri = new Uri("https://my-storage.blob.core.windows.net/my-container/your-blob-filename?sv=2018-03-28&sr=c&sig=DZSbKgaKd%2FjYQbYQf7eOAZ%2BVFSY1Rq2M7HIVXs%2F%2BPtA%3D&se=2023-02-12T04%3A08%3A07Z&sp=rcwl"); var blobClient = new BlobClient(blobUri); await using var fileStream = entry.Open(); await blobClient.UploadAsync(fileStream, true);
方式二:通过BlobContainerClient获取BlobClient
先使用容器SAS URI创建容器客户端,再通过容器客户端获取目标Blob的客户端:
var containerClient = new BlobContainerClient(new Uri(connectionString)); // 替换成实际要上传的Blob文件名 var blobClient = containerClient.GetBlobClient("your-blob-filename"); await using var fileStream = entry.Open(); await blobClient.UploadAsync(fileStream, true);
额外检查点
- 确认SAS权限:当前
sp=rcwl包含写入权限(w),满足Blob上传需求;如果是追加Blob上传,需要额外添加a权限 - 确认SAS有效期:报错时间在SAS到期时间(2023-02-12T04:08:07Z)之前,此问题可排除
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

