Azure SDK .NET:使用容器SAS批量删除Blob遇403权限错误
我拥有一个具备Add/Create/Write/Delete权限(无Read、List权限)的Blob容器SAS,需要批量删除该容器内的Blob,执行以下代码:
try { string sasToken = "sv=2023-0103&si=wd&sr=c&sig=blah-blah-blah"; BlobContainerClient contClient = new(CreateContainerUrl(container), new AzureSasCredential(sasToken)); BlobBatchClient batchClient = new(contClient); await batchClient.DeleteBlobsAsync(blobUris); } catch (Exception ex) { _logger.LogError(ex, "Failed to delete multiple blobs in \"{0}\" container", container); throw; }
执行后出现以下错误:
Status: 403 (This request is not authorized to perform this operation using this permission.)
ErrorCode: AuthorizationPermissionMismatch
核心原因
批量删除操作(BlobBatchClient.DeleteBlobsAsync)要求SAS必须具备List(l)权限。
单个Blob删除仅需Delete权限,但Azure Blob存储的批量删除API在执行时,会先对传入的Blob URIs做存在性验证,这个过程依赖容器级的List权限;同时批量操作的底层逻辑也需要List权限完成请求预处理,因此即使拥有Delete权限,缺少List也会触发403权限不匹配错误。
解决方案
方案一:更新SAS权限,添加List权限
重新生成SAS时,确保权限参数包含Delete(d)和List(l),批量删除操作即可正常执行。方案二:改用单个Blob删除(无需List权限)
如果无法添加List权限,可循环逐个调用单个Blob的删除方法,该操作仅需Delete权限。示例代码如下:
try
{
string sasToken = "sv=2023-0103&si=wd&sr=c&sig=blah-blah-blah";
foreach (var blobUri in blobUris) { var blobClient = new BlobClient(new Uri(blobUri), new AzureSasCredential(sasToken)); await blobClient.DeleteAsync(); }
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to delete blob in "{0}" container", container);
throw;
}
内容的提问来源于stack exchange,提问作者AlexB

