使用.NET应用身份验证库获取Azure AD令牌时角色声明缺失
托管标识获取Azure AD令牌缺失角色声明的解决方法
问题出在托管标识是独立的服务主体,你之前在应用注册里配置的API权限是授予你的应用注册本身的,而非这个系统分配的托管标识。Postman用应用注册的client credentials能拿到角色,是因为权限直接配置给了那个应用主体,但托管标识的权限需要单独分配。
下面是具体的修复步骤:
1. 获取托管标识的服务主体ID
- 登录Azure门户,进入你的函数应用,左侧菜单选「身份」→「系统分配」,复制「对象(主体) ID」;
- 或者用Azure CLI快速获取:
az resource show --id /subscriptions/<订阅ID>/resourceGroups/<资源组>/providers/Microsoft.Web/sites/<函数应用名称> --query identity.principalId --output tsv
2. 给托管标识授予目标API的应用角色
方法一:Azure Portal可视化操作
- 进入你作为API公开的那个应用注册(就是配置了
appRoles的应用); - 左侧菜单选「应用角色分配」,点击「添加应用角色分配」;
- 在「用户、组或服务主体」选项下,搜索托管标识的名称或刚才复制的主体ID,选中它;
- 选择你创建的
Search.Address角色,完成分配。
方法二:Azure CLI命令执行
# 替换占位符:<目标API应用ID>是你公开为API的应用注册的Client ID,<角色ID>是清单里的82bc288b-b03b-4acb-a99b-f246d8ad1551,<托管标识主体ID>是步骤1获取的ID az ad app permission add --id <目标API应用ID> --api-permissions <角色ID>=Role --principal <托管标识主体ID> az ad app permission grant --id <目标API应用ID> --principal <托管标识主体ID>
3. 验证结果
重新运行你的函数获取令牌,用jwt.ms解析令牌内容,此时应该能看到roles声明里包含Search.Address了。
额外检查点:
- 你已经将目标API的
accessTokenAcceptedVersion设为2,这是正确的,确保了v2格式令牌; - 代码里的scope参数
api://bee96ec1-1acc-456c-847b-84f88870b1d9/.default格式正确,无需修改。
内容的提问来源于stack exchange,提问作者PavanKumar GVVS
相关产品推荐
相关产品推荐

