本地开发用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
相关产品推荐
相关产品推荐

