为何Azure CLI可插入表实体,C#应用报AuthorizationPermissionMismatch?
问题详情
我尝试用DefaultAzureCredentials对TableServiceClient做认证,向Azure Table Storage插入实体。
Startup.cs代码
DefaultAzureCredentialOptions options = new DefaultAzureCredentialOptions { Diagnostics = { LoggedHeaderNames = { ...}, IsLoggingContentEnabled = true, IsTelemetryEnabled = true, IsAccountIdentifierLoggingEnabled = true }, ExcludeAzurePowerShellCredential = true, ExcludeSharedTokenCacheCredential = true, ExcludeVisualStudioCredential = true, ExcludeWorkloadIdentityCredential = true, ExcludeEnvironmentCredential = true, ExcludeManagedIdentityCredential = true, ExcludeAzureDeveloperCliCredential = true, ExcludeInteractiveBrowserCredential = true, }; services.AddSingleton(new TableServiceClient( endpoint: new Uri(Configuration.GetValue<string>("AzureTableStorage:Uri")), tokenCredential: new DefaultAzureCredential(options)));
认证日志
[Informational] Azure-Identity: DefaultAzureCredential credential selected: Azure.Identity.AzureCliCredential [Informational] Azure-Identity: DefaultAzureCredential.GetToken succeeded. Scopes: [ https://storage.azure.com/.default ]
CLI操作正常
我能通过Azure CLI向表中添加实体:
az storage entity insert --account-name oodledev --account-key xxxxx --table-name purchaseorder --entity PartitionKey=3 RowKey=CA, username=Sam
C#应用报错
但测试C#应用插入表行时,调用tableClient.SubmitTransactionAsync(transactionActions)抛出异常:
Exception thrown: 'Azure.Data.Tables.TableTransactionFailedException' in System.Private.CoreLib.dll: '0: this request is not authorized to perform this operation using this permission.
RequestId:f14fc64e-8002-0038-28f3-59a7ea000000
Time:2024-02-07T18:26:01.3577039Z
The index of the entity that caused the error can be found in FailedTransactionActionIndex.
Status: 403 (Forbidden)
ErrorCode: AuthorizationPermissionMismatch
原因分析
Azure CLI用账户密钥认证时,拥有存储账户的全权限;而C#应用用的是Azure CLI登录用户的身份令牌,该用户缺少Azure Table Storage操作所需的RBAC权限。
- CLI通过
--account-key认证时,权限不受RBAC限制,默认拥有所有存储操作权限。 AzureCliCredential获取的令牌对应你当前CLI登录的用户,该用户需要被授予存储表数据参与者这类RBAC角色,才能执行表实体的写入操作。
解决方案
1. 为CLI登录用户分配RBAC权限
- 登录Azure门户,找到目标存储账户。
- 进入「访问控制(IAM)」页面,点击「添加」→「添加角色分配」。
- 搜索并选择「存储表数据参与者」角色。
- 在「成员」页签选择你当前登录Azure CLI的用户账户,完成角色分配。
- 等待几分钟让权限生效。
2. 重新验证
执行az account clear后再az login重新登录CLI,然后运行C#应用测试插入操作。
3. 可选:确认令牌范围
如果权限分配后仍有问题,可以尝试指定存储账户专属的令牌范围:
var tokenRequestContext = new TokenRequestContext(new[] { $"https://{accountName}.table.core.windows.net/.default" }); var token = await new DefaultAzureCredential(options).GetTokenAsync(tokenRequestContext); // 用该令牌初始化TableServiceClient
内容的提问来源于stack exchange,提问作者Sora Teichman

