.NET Core:使用AzureAD/EntraID认证访问Azure DevOps REST API遇问题
问题诊断与解决方案
核心问题
返回203 Non-Authoritative Information的本质是你当前获取的访问令牌不具备访问Azure DevOps API的权限:
- 你现在请求的是自身Entra ID应用的
.default范围令牌,仅能授权访问你自己的应用,没有Azure DevOps的访问权限 - Azure DevOps收到无效权限的令牌后,会返回203并触发认证重定向,但前端无法处理该跳转逻辑,最终导致请求失败
具体修复步骤
1. 替换为Azure DevOps的正确权限范围
在Program.cs中,将默认令牌范围替换为Azure DevOps官方的API范围(Azure DevOps的Entra ID客户端固定ID为499b84ac-1321-427f-aa17-267ca6975798):
builder.Services.AddMsalAuthentication(options => { builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication); // 替换为Azure DevOps专属权限范围 options.ProviderOptions.DefaultAccessTokenScopes.Add("499b84ac-1321-427f-aa17-267ca6975798/.default"); });
2. 注册Azure DevOps专用HttpClient
不要复用指向自身后端的HttpClient,单独注册一个用于调用Azure DevOps API的客户端:
// 新增:注册Azure DevOps专用HttpClient builder.Services.AddHttpClient("AzureDevOps", client => { client.BaseAddress = new Uri("https://dev.azure.com/"); }); // 保留原有后端API的HttpClient配置 builder.Services.AddHttpClient("testauthblazor.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)) .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>(); // 修改AzureDevOpsService的注入逻辑,使用专用HttpClient builder.Services.AddScoped<AzureDevOpsService>(sp => new AzureDevOpsService(sp.GetRequiredService<IHttpClientFactory>().CreateClient("AzureDevOps")));
3. 请求令牌时明确指定Azure DevOps范围
在TestPage.razor中,请求令牌时指定Azure DevOps的权限范围,确保获取到正确的授权令牌:
@code { private List<string> projects; protected override async Task OnInitializedAsync() { // 指定Azure DevOps权限范围请求令牌 var result = await TokenProvider.RequestAccessToken( new AccessTokenRequestOptions { Scopes = new[] { "499b84ac-1321-427f-aa17-267ca6975798/.default" } }); if (result.TryGetToken(out var token)) { projects = await DevOpsService.GetProjectsAsync(token.Value); } } }
4. 确认Entra ID应用的权限配置
确保你的Entra ID应用已添加Azure DevOps的API权限:
- 进入Entra ID门户→应用注册→你的应用→API权限→添加权限
- 选择「Azure DevOps」→「委派权限」,勾选
user_impersonation(或业务需求的具体权限) - 点击「授予管理员同意」(租户级应用需完成此步骤)
额外说明
- Azure DevOps完全支持Entra ID颁发的JWT令牌,只要权限范围正确,令牌格式不是问题
- 203状态码是Azure DevOps的权限校验不通过后的重定向响应,前端无法处理该跳转才表现为报错,核心原因是权限范围不匹配
内容的提问来源于stack exchange,提问作者lbpoundz
相关产品推荐
相关产品推荐

