.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
相关产品推荐
相关产品推荐

