.NET Core应用配置授权验证Azure B2C访问令牌返回401如何解决
问题排查及解决方案
1. 中间件顺序错误(最常见诱因)
你当前Configure方法中的中间件配置缺少认证中间件,且顺序错误。认证中间件必须在授权中间件之前执行,否则请求不会自动解析携带的JWT令牌,会直接返回401。
修正后的中间件顺序:
public void Configure(IApplicationBuilder appBuilder) { // ...其他前置中间件(如异常处理、静态文件等) appBuilder.UseRouting(); // 先添加认证中间件解析令牌 appBuilder.UseAuthentication(); // 再执行授权校验逻辑 appBuilder.UseAuthorization(); // ...端点映射等后续中间件 }
2. 手动拉取OpenID配置的潜在问题
你在AddJwtBearer配置中直接用.Result同步调用异步方法拉取配置,启动阶段容易出现线程死锁、网络请求失败等问题,而且后续签名密钥过期后无法自动刷新。
不需要手动拉取配置,直接使用JWT Bearer原生提供的元数据配置即可,框架会自动拉取、刷新issuer和签名密钥,修正后的服务注册代码:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(cfg => { // 直接填入B2C的元数据地址即可,无需自行拉取配置 cfg.MetadataAddress = "https://<tenant>.b2clogin.com/<tenant>.onmicrosoft.com/<policyId>/v2.0/.well-known/openid-configuration"; cfg.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = true, ValidAudience = "<ClientId>", ValidateIssuer = true, ValidateIssuerSigningKey = true, ValidateLifetime = true }; });
3. 其他校验错误排查点
- 确认请求头中携带的令牌格式正确,格式为
Bearer <accessToken>,注意Bearer和令牌之间的空格不能省略 - 确认你配置的
<policyId>和实际签发令牌时使用的B2C用户流/自定义策略完全一致,不同策略的issuer值不同,会导致签发方校验失败 - 确认
<ClientId>填写的是你在B2C中注册的当前API的客户端ID,不是前端客户端的ID - 如果你的令牌是v1版本,可以临时关闭
ValidateAudience测试,确认是否是受众配置错误导致的401
内容的提问来源于stack exchange,提问作者Svetlana
相关产品推荐
相关产品推荐

