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

使用.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可视化操作

  1. 进入你作为API公开的那个应用注册(就是配置了appRoles的应用);
  2. 左侧菜单选「应用角色分配」,点击「添加应用角色分配」;
  3. 在「用户、组或服务主体」选项下,搜索托管标识的名称或刚才复制的主体ID,选中它;
  4. 选择你创建的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:45:32