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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:45:32