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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:10:14