如何让公司A的SPN-A访问公司B云资源并读取标签?
实现公司A的SPN-A读取公司B的Azure资源标签
公司B需要完成的配置步骤
- 给SPN-A分配读取权限
- 登录公司B的Azure门户,进入需要授权的订阅或资源组(如果仅需读取特定资源组的标签)
- 打开「访问控制(IAM)」→「添加」→「添加角色分配」
- 角色选择「Reader」(如果只想限制标签读取,可选更细粒度的「标签读取者」角色)
- 在「成员」选项卡,选择「用户、组或服务主体」,点击「选择成员」
- 在弹出窗口的「目录」下拉框中,输入公司A的租户ID/域名找到对应租户,搜索SPN-A的名称或client_id并选中,确认选择
- 完成角色分配,等待权限生效(通常几分钟内即可)
- 检查跨租户访问策略(若遇到权限问题)
- 进入公司B的Azure AD →「外部标识」→「跨租户访问设置」
- 找到公司A的租户条目,确保「入站访问」设置为「允许」,且允许服务主体的访问请求(若默认策略限制了外部身份)
公司A这边的脚本修改
需要调整Python SDK的认证逻辑,让SPN-A针对公司B的租户获取访问令牌,同时指定公司B的订阅ID:
from azure.identity import ClientSecretCredential from azure.mgmt.resource import ResourceManagementClient from azure.mgmt.compute import ComputeManagementClient # SPN-A的基础信息(来自公司A的AD) SPN_CLIENT_ID = "SPN-A的client_id" SPN_CLIENT_SECRET = "SPN-A的client_secret" COMPANY_A_TENANT_ID = "公司A的tenant_id" # 公司B的租户与订阅信息 COMPANY_B_TENANT_ID = "公司B的tenant_id" COMPANY_B_SUBSCRIPTION_ID = "公司B的subscription_id" # 创建跨租户认证凭证 credential = ClientSecretCredential( tenant_id=COMPANY_A_TENANT_ID, client_id=SPN_CLIENT_ID, client_secret=SPN_CLIENT_SECRET, # 指定目标访问租户(公司B) authority=f"https://login.microsoftonline.com/{COMPANY_B_TENANT_ID}" ) # 示例:读取全量资源标签 resource_client = ResourceManagementClient(credential, COMPANY_B_SUBSCRIPTION_ID) for resource in resource_client.resources.list(): print(f"资源名称: {resource.name}, 标签: {resource.tags}") # 示例:读取VM标签 compute_client = ComputeManagementClient(credential, COMPANY_B_SUBSCRIPTION_ID) for vm in compute_client.virtual_machines.list_all(): print(f"VM名称: {vm.name}, 标签: {vm.tags}")
注意事项
- 确保SPN-A的client_secret未过期,且公司A的AD未限制该SPN的跨租户访问
- 若仅需读取特定类型资源的标签,可使用对应专业管理客户端(比如磁盘用
DiskManagementClient、虚拟网络用NetworkManagementClient),权限分配也可更精准
内容的提问来源于stack exchange,提问作者amitsuneja
相关产品推荐
相关产品推荐

