使用Azure.Storage.Blobs上传带标签Blob时遇AuthorizationPermissionMismatch异常
问题场景
在Azure FunctionApp中使用Azure.Storage.Blobs库上传Blob时,通过BlobUploadOptions设置Tags的UploadAsync方法触发403权限错误,但不带Tags的UploadBlobAsync方法可正常运行。已为服务主体分配Storage Blob Data Contributor角色。
报错代码示例:
string fileName = $"{DateTime.Now:yyyyMMdd_HHmmss_fff}.json"; string json = JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true }); var options = new BlobUploadOptions { Tags = new Dictionary<string, string> { { "Status", isFailed ? "Failed" : "Success" }, { "DeviceId", queueItem.DeviceId.ToString() }, } }; var blobClient = _blobContainerClient.GetBlobClient(fileName); await blobClient.UploadAsync(BinaryData.FromString(json), options);
异常信息:
Azure.RequestFailedException: This request is not authorized to perform this operation using this permission.
RequestId:21a733b3-201e-00a4-7899-75df76000000 Time:2024-03-13T22:57:46.6502306Z Status: 403 (This request is not authorized to perform this operation using this permission.)
ErrorCode: AuthorizationPermissionMismatch
原因
Storage Blob Data Contributor角色的权限范围不包含Blob标签的写入操作。上传时通过BlobUploadOptions.Tags设置标签,本质是在上传Blob的同时执行标签写入操作,该角色无此权限,因此触发403错误;不带Tags的上传仅执行Blob内容写入,属于Contributor角色的权限范围,所以正常运行。
解决方案
方案1:更换为Storage Blob Data Owner角色
Storage Blob Data Owner角色拥有Blob存储的完整权限,包括标签的读写操作。将服务主体的角色从Storage Blob Data Contributor替换为Storage Blob Data Owner,即可解决权限问题。
方案2:创建自定义RBAC角色
若不想使用权限过大的Owner角色,可创建自定义角色仅添加必要的标签写入权限:
- 进入Azure Portal的存储账户,访问Access control (IAM) -> Add -> Add custom role
- 在权限配置中添加
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write权限 - 将该自定义角色分配给服务主体
方案3:分两步操作(上传+单独设置标签)
先上传Blob(不带Tags),再单独调用SetTagsAsync方法设置标签(需确保服务主体拥有标签写入权限):
// 先上传Blob var blobClient = _blobContainerClient.GetBlobClient(fileName); await blobClient.UploadAsync(BinaryData.FromString(json)); // 再设置标签 await blobClient.SetTagsAsync(new Dictionary<string, string> { { "Status", isFailed ? "Failed" : "Success" }, { "DeviceId", queueItem.DeviceId.ToString() }, });
内容的提问来源于stack exchange,提问作者prb

