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

Azure CLI以服务主体身份认证时无法查询principalName的问题

排查解决步骤
  • 第一步:确认权限配置正确性

    你配置的Directory.Read.All权限必须满足两个要求:
    • 权限类型为应用程序权限,不是委托权限,服务主体非交互式登录场景下委托权限不会生效
    • 已经点击了「授予管理员同意」按钮,未授予租户级管理员同意的权限不会实际生效
      你提供的截图里仅能看到权限已添加,无法确认是否完成了管理员同意授权,请优先核对这一点。
  • 第二步:清除缓存并重新登录服务主体

    权限配置生效存在1-5分钟的延迟,且Azure CLI本地可能缓存了旧的身份凭据,执行以下命令重置登录状态后重试:
    # 清除所有本地账号缓存
    az account clear
    # 重新使用服务主体登录,注意替换为你实际的客户端ID、密钥、租户ID
    az login --service-principal -u <你的服务主体客户端ID> -p <客户端密钥> --tenant <目标租户ID>
    
  • 第三步:核对租户一致性

    执行命令查看当前登录的租户ID,确认和你个人账号登录时的租户、配置权限的租户为同一个:
    az account show --query tenantId -o tsv
    
  • 第四步:补充参数重试查询

    执行查询时增加--include-inherited参数覆盖继承的角色分配,同时可以加--debug参数查看接口返回的原始报文,确认原始返回中是否存在principalName字段:
    az role assignment list --subscription aa11bb33-cc77-dd88-ee99-0918273645aa --role "Owner" --include-inherited --debug
    
  • 兜底方案:通过Graph接口单独查询主体名称

    如果上述步骤都无法解决,你可以先通过az role assignment list拿到所有principalId,再调用Microsoft Graph接口查询对应主体的名称,示例Python代码逻辑如下:
    # 已获得azure.identity的Credential对象的前提下
    import requests
    from azure.identity import ClientSecretCredential
    
    tenant_id = "你的租户ID"
    client_id = "服务主体客户端ID"
    client_secret = "服务主体密钥"
    
    credential = ClientSecretCredential(tenant_id, client_id, client_secret)
    token = credential.get_token("https://graph.microsoft.com/.default")
    headers = {"Authorization": f"Bearer {token.token}"}
    
    # 替换为你拿到的principalId
    principal_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    resp = requests.get(f"https://graph.microsoft.com/v1.0/directoryObjects/{principal_id}", headers=headers)
    principal_name = resp.json().get("userPrincipalName") or resp.json().get("displayName")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:15:06