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

本地开发用DefaultAzureCredential调用带API范围与应用角色的Entra API遇阻

问题描述

我想实现:本地开发时用已登录的Azure账号、Azure Web App部署后用托管标识,从Entra获取有效令牌来调用带有暴露API范围的接口,但目前本地运行时遇到了问题。

Entra配置步骤

  • 在Entra中创建了代表目标API的应用注册
  • 在该应用注册的「暴露API」页面创建了一个范围
  • 创建了用于API读取权限的「应用角色」
  • 在企业应用中,给调用API的系统托管标识SPN和我的个人Azure账号都授予了上述应用角色权限

.NET核心代码

using Azure.Identity;
// 其他必要引用...

var credential = new DefaultAzureCredential();
var client = new HttpClient();
var accessToken = await credential.GetTokenAsync(new TokenRequestContext([
    "api://MY_APP_REG_ID/API.Access",
]));

Console.WriteLine(accessToken.Token);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Token);

var result = await client.GetStringAsync("https://api.somedomain.com/v1/.....");

本地运行报错

执行dotnet run后抛出异常:

Unhandled exception. Azure.Identity.CredentialUnavailableException: DefaultAzureCredential failed to retrieve a token from the included credentials.
- EnvironmentCredential authentication unavailable. Environment variables are not fully configured.
- WorkloadIdentityCredential authentication unavailable. The workload options are not fully configured.
- ManagedIdentityCredential authentication unavailable. No response received from the managed identity endpoint.
- Visual Studio Token provider can't be accessed at C:\Users\dan\AppData\Local\.IdentityService\AzureServiceAuth\tokenprovider.json
- Please run 'az login' to set up account
- Azure PowerShell authentication failed due to an unknown error.

当前现状与需求

手动执行az account get-access-token --scope api://MY_APP_REG_ID/API.Access后代码能正常运行,用客户端ID+密钥的方式也能工作,但我想实现本地用个人开发者Azure账号、云端用托管标识的无密钥登录方式,请问哪里配置出了问题?


解决办法

1. 调整DefaultAzureCredential配置,启用Azure CLI凭据

DefaultAzureCredential默认不会尝试使用Azure CLI的登录凭据,这就是你手动跑az命令有效但代码不行的核心原因。修改代码,显式开启Azure CLI凭据支持:

var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
{
    IncludeAzureCliCredential = true
});

2. 修正权限类型不匹配的问题

你给个人账号授予的是应用角色(应用权限),但本地用个人账号请求令牌时,默认是走委托权限(用户上下文),而你代码里请求的api://MY_APP_REG_ID/API.Access是暴露的API范围(属于委托权限),两者不匹配:

  • 要么在API的应用注册里,给你的个人账号添加对应的委托权限,并完成管理员同意;
  • 如果你确实需要用应用权限,在请求令牌时指定API的应用注册ID作为client_id,强制以应用身份获取令牌,但这种方式不适合本地开发者账号的场景,更推荐用委托权限。

3. 修复本地开发工具的凭据源

如果想用VS Code或Visual Studio的登录状态:

  • 确保VS Code安装了Azure Account扩展并完成登录,选中正确的Azure订阅;
  • 打开Visual Studio,确认已添加并登录你的Azure账号,初始化后会自动生成报错里提到的Token provider文件;
  • 重启开发工具,让凭据源生效。

4. 云端托管标识的前置验证(确保部署后正常)

虽然问题出在本地,但提前确认云端配置:

  • 确保Azure Web App的系统托管标识已启用;
  • 托管标识的服务主体已被正确授予API的应用角色权限;
  • 云端运行时DefaultAzureCredential会自动识别并使用托管标识,无需额外代码配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:23:14