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

使用Azure Python SDK创建资源时遇AuthorizationFailed授权错误

解决Azure SDK for Python的AuthorizationFailed(资源组读取权限)错误

刚碰到这个错误的时候我也踩过坑,其实核心原因很清晰:你用的服务主体(就是CLIENT_ID对应的那个身份)没有在你的免费订阅(或目标资源组)上被授予执行Microsoft.Resources/subscriptions/resourcegroups/read操作的权限。哪怕是免费订阅,Azure的权限控制逻辑和付费订阅完全一致,下面是具体的解决步骤:

1. 先确认服务主体和订阅的关联正确性

首先得确保你的服务主体存在,并且和你使用的免费订阅是对应的:

  • 打开Azure CLI,运行命令检查服务主体信息:
    az ad sp show --id <你的CLIENT_ID>
    
    对比返回结果里的objectId和错误信息中的OBJECT_ID,确认是同一个身份。
  • 再检查订阅是否正确:
    az account show --subscription <你的SUBSCRIPTION_ID>
    
    确保返回的订阅名称、ID和你正在使用的免费订阅一致。

2. 给服务主体分配合适的权限角色

这是解决问题的关键,你需要手动给服务主体添加读取(或更高)的权限:

方式一:通过Azure Portal操作

  • 登录Azure Portal,找到你的免费订阅页面,点击左侧菜单的「访问控制(IAM)」
  • 点击顶部的「添加」→「添加角色分配」
  • 在「角色」标签里,选择**「读者(Reader)」**(如果你的脚本需要创建/修改资源,就选「参与者(Contributor)」,遵循最小权限原则选合适的角色)
  • 切换到「成员」标签,选择「用户、组或服务主体」,然后搜索你的CLIENT_ID对应的服务主体名称,找到后添加进去
  • 点击「查看 + 分配」完成操作

方式二:通过Azure CLI命令操作

如果习惯用命令行,直接运行:

# 给订阅级别的读取权限(如果需要全订阅操作)
az role assignment create --assignee <你的CLIENT_ID> --role "Reader" --scope "/subscriptions/<你的SUBSCRIPTION_ID>"

# 或者只给特定资源组的权限(更安全)
az role assignment create --assignee <你的CLIENT_ID> --role "Reader" --scope "/subscriptions/<你的SUBSCRIPTION_ID>/resourceGroups/<目标资源组名称>"

3. 验证权限并重新测试

  • 注意:Azure的权限分配可能有1-5分钟的同步延迟,别急着立刻重试
  • 等待几分钟后,重新运行你的Python脚本,应该就能正常读取资源组了
  • 也可以用CLI验证权限是否生效:
    az role assignment list --assignee <你的CLIENT_ID> --subscription <你的SUBSCRIPTION_ID>
    
    查看返回结果里是否有你刚才添加的角色记录

4. 检查Python代码的认证逻辑

最后再确认下你的代码里认证部分是否正确,比如服务主体认证的标准写法:

from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient

# 初始化凭据
credentials = ServicePrincipalCredentials(
    client_id="你的CLIENT_ID",
    secret="你的CLIENT_SECRET",
    tenant="你的TENANT_ID"
)

# 初始化资源管理客户端
resource_client = ResourceManagementClient(
    credentials,
    "你的SUBSCRIPTION_ID"
)

# 尝试读取资源组列表
try:
    resource_groups = resource_client.resource_groups.list()
    for group in resource_groups:
        print(f"资源组名称: {group.name}")
except Exception as e:
    print(f"错误信息: {str(e)}")

确保所有参数(CLIENT_ID、SUBSCRIPTION_ID等)都没有拼写错误,尤其是SUBSCRIPTION_ID要和你的免费订阅完全一致。

额外注意点

  • 免费订阅的管理员权限:你作为免费订阅的创建者有全局管理员权限,但服务主体不会自动继承这个权限,必须手动分配角色
  • 最小权限原则:尽量不要给服务主体订阅级别的全权限,只授予它需要操作的资源组或资源类型的权限,这样更安全

内容的提问来源于stack exchange,提问作者im_maddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:22:25