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
相关产品推荐
相关产品推荐

