You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Azure CLI可插入表实体,C#应用报AuthorizationPermissionMismatch?

使用DefaultAzureCredentials认证Azure Table Storage插入实体时出现403权限不匹配问题

问题详情

我尝试用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权限

  1. 登录Azure门户,找到目标存储账户。
  2. 进入「访问控制(IAM)」页面,点击「添加」→「添加角色分配」。
  3. 搜索并选择「存储表数据参与者」角色。
  4. 在「成员」页签选择你当前登录Azure CLI的用户账户,完成角色分配。
  5. 等待几分钟让权限生效。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:43:14