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

.NET Core 2.0 API通过Azure AD认证遇401问题求助

Hey,我看你在.NET Core 2.0 API集成Azure AD JWT认证时碰到了所有请求都返回401的问题,咱们一步步来排查和解决这个问题:

可能的问题点及解决方案

1. Authority格式不正确

你当前使用的Authority是"https://login.microsoftonline.com",这太宽泛了——Azure AD需要你指定具体的租户(租户ID或租户域名)才能正确验证令牌。正确的Authority格式应该是:

  • 带租户ID:https://login.microsoftonline.com/your-tenant-guid
  • 或带租户域名:https://login.microsoftonline.com/yourdomain.onmicrosoft.com
    如果是使用Azure AD v2.0端点,还要加上/v2.0后缀,比如:https://login.microsoftonline.com/your-tenant-guid/v2.0

2. Audience配置不匹配

你设置的Audience是"https://OURDOMAIN.onmicrosoft.com/OURAPPLICATIONNAME",需要确保这个值和Azure AD中你注册的API的应用ID URI完全一致(包括大小写、路径)。另外,也可以直接使用API的Client ID作为Audience,这种方式更不容易出错,因为Client ID是唯一且固定的。

3. 未启用认证中间件

在.NET Core 2.0中,仅仅配置AddAuthentication还不够,必须在Startup.Configure方法中启用认证中间件,而且要放在UseMvc之前,否则认证逻辑不会生效:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // 先添加其他中间件(比如异常处理、静态文件等)
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // 关键:启用认证中间件,必须在UseMvc之前
    app.UseAuthentication();

    app.UseMvc();
}
修正后的示例代码

下面是调整后的AddAzureAd扩展方法,包含更规范的配置:

public class AzureAdOptions
{
    public string Instance { get; set; } = "https://login.microsoftonline.com/";
    public string TenantId { get; set; }
    public string ClientId { get; set; } // API的Client ID,或应用ID URI
}

public static IServiceCollection AddAzureAd(this IServiceCollection services, AzureAdOptions options)
{
    services.AddAuthentication(o =>
    {
        o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(o =>
    {
        // 构造正确的Authority
        o.Authority = $"{options.Instance}{options.TenantId}";
        // 使用ClientID作为Audience(或替换为你的应用ID URI)
        o.Audience = options.ClientId;
        // 增加额外的令牌验证规则
        o.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            // 验证签发者,v1端点的格式是{Instance}{TenantId},v2端点要加/v2.0
            ValidIssuer = $"{options.Instance}{options.TenantId}/v2.0",
            ValidateLifetime = true,
            ClockSkew = TimeSpan.FromMinutes(5) // 允许少量的时间偏差
        };
    });

    return services;
}
额外排查步骤
  • 用jwt.io解析你的JWT令牌,检查:
    • iss(签发者)是否和你配置的ValidIssuer一致
    • aud(受众)是否和你配置的Audience一致
    • 令牌是否过期(exp字段)
  • 确认Azure AD中客户端应用已经被授予访问该API的权限,并且请求令牌时包含了正确的scope
  • 如果是使用v2.0端点,确保API和客户端应用都配置了支持v2.0令牌

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:19:26