如何限制Azure应用注册仅能向指定存储容器上传Blob
分步实现指定容器的Blob List/Create权限控制
1. 创建自定义RBAC角色
内置存储角色(如Storage Blob Data Contributor)权限范围过宽,包含Blob删除、容器管理等操作,不符合需求。需创建仅包含Blob列出和创建权限的自定义角色:
角色定义JSON
{ "Name": "Custom Blob List & Create", "IsCustom": true, "Description": "仅允许在指定容器中列出和创建Blob,禁止容器管理、Blob删除等操作", "Actions": [ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read", "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write" ], "NotActions": [], "AssignableScopes": [ "/subscriptions/你的订阅ID" ] }
创建步骤
- 打开Azure门户,进入你的订阅页面
- 切换到「访问控制(IAM)」→「角色」标签
- 点击「添加」→「添加自定义角色」
- 选择「从JSON导入」,粘贴上述JSON内容,替换
你的订阅ID为实际值 - 确认信息无误后点击「创建」
2. 给服务主体分配角色到指定容器
将自定义角色限定在目标容器范围内,确保服务主体仅能操作该容器:
- 打开目标存储账户,进入指定的容器页面
- 切换到「访问控制(IAM)」→「添加」→「添加角色分配」
- 「角色」选择刚才创建的「Custom Blob List & Create」
- 「成员」选择「用户、组或服务主体」,搜索你的Client ID对应的服务主体名称并选中
- 点击「查看 + 分配」完成角色分配
3. C#代码实现Blob操作
使用Azure.Storage.Blobs库,通过Client ID和Secret获取凭证,执行允许的Blob操作:
using Azure.Identity; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; using System.Text; using System.IO; var tenantId = "你的租户ID"; var clientId = "你的客户端ID"; var clientSecret = "你的客户端密钥"; var storageAccountName = "你的存储账户名"; var containerName = "指定容器名"; // 构建凭证 var credential = new ClientSecretCredential(tenantId, clientId, clientSecret); // 直接创建目标容器的客户端(符合权限范围) var containerClient = new BlobContainerClient( new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}"), credential ); // 列出容器内Blob(允许操作) await foreach (BlobItem blob in containerClient.GetBlobsAsync()) { Console.WriteLine($"Blob: {blob.Name}"); } // 上传Blob(创建操作,允许) var blobClient = containerClient.GetBlobClient("demo-file.txt"); using var stream = new MemoryStream(Encoding.UTF8.GetBytes("测试Blob内容")); await blobClient.UploadAsync(stream, overwrite: true); Console.WriteLine("Blob上传成功");
验证权限
尝试执行以下操作会返回403权限不足错误,符合预期:
- 删除Blob
- 创建/删除容器
- 修改Blob元数据(若需允许可添加对应Actions,当前需求无需)
内容的提问来源于stack exchange,提问作者NILESH
相关产品推荐
相关产品推荐

