.NET 7 WebAPI配置JwtBearer/OpenIdConnect遇invalid_token错误求助
.NET 7 WebAPI JwtBearer认证问题修复
问题现象
配置JwtBearer认证时,初始出现302跳转;添加options.Events后变为401错误,响应头返回Bearer error="invalid_token"。将Bearer Token复制到jwt.io验证显示有效,但通过Swagger携带Token访问带[Authorize]特性的接口仍失败。提高日志级别后看到提示:No SecurityTokenValidator available for token。已排除Keycloak(SSO服务)问题,其他应用单点登录正常,相关NuGet包已更新。
问题根因
核心问题出在OnMessageReceived事件的Token获取逻辑:直接将Authorization头的完整值赋值给context.Token,而该头的格式是Bearer {token},包含前缀"Bearer "。这种带前缀的字符串无法被JWT验证器识别,导致找不到合适的验证器处理Token,最终触发401错误。
修复方案
1. 修正Token提取逻辑
在OnMessageReceived事件中,正确提取Token:去掉"Bearer "前缀,只保留实际的Token字符串。
2. 优化Token验证参数配置(可选)
若无需自定义验证规则,建议移除手动创建的TokenValidationParameters,让JwtBearer通过MetadataAddress自动从OpenID配置端点获取验证参数,避免手动配置遗漏或错误。
修正后的代码片段
Startup.cs 服务配置部分
services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.MetadataAddress = Configuration.GetSection("appSettings")["auth0Domain"] + "/.well-known/openid-configuration"; options.Audience = Configuration.GetSection("appSettings")["auth0Audience"]; options.RequireHttpsMetadata = false; options.IncludeErrorDetails = true; // 推荐:移除手动TokenValidationParameters,使用MetadataAddress自动获取的配置 // options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters // { // ValidateIssuer = false, // ValidateAudience = false // }; options.Events = new JwtBearerEvents { OnMessageReceived = context => { var authHeader = context.Request.Headers["Authorization"].FirstOrDefault(); if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase)) { context.Token = authHeader["Bearer ".Length..].Trim(); } return Task.CompletedTask; }, }; }); IdentityModelEventSource.ShowPII = true; // CORS配置保持不变 services.AddCors(options => { options.AddDefaultPolicy( builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); });
Startup.cs 中间件配置部分
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, Service service) { Globals.service = service; service.Start(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); }); // app.UseHttpsRedirection(); app.UseRouting(); app.UseCors(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.UseWebSockets(); app.Use(async (context, next) => { await Globals.service.tm.HandleWebRequest(context, next); }); }
验证说明
修正后,重新启动API,通过Swagger携带Bearer Token访问受保护接口,认证应正常通过。若仍有问题,可检查:
MetadataAddress是否可正常访问,返回的OpenID配置是否包含正确的密钥信息Audience配置是否与Token中的aud声明一致- 确保Token未过期,且签名算法与配置匹配
内容的提问来源于stack exchange,提问作者leland knight
相关产品推荐
相关产品推荐

