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

ASP.NET Core 2.2自定义JWT中间件IsAuthenticated始终为False问题

问题分析与解决方案

你的问题主要出在中间件的注册顺序上,还有一个小问题是扩展方法的调用参数不匹配,我们一步步来解决:

1. 中间件顺序错误导致无法获取认证用户

在ASP.NET Core的请求管道中,中间件的注册顺序直接决定了它们的执行逻辑。你当前把UseMyMiddleware注册在UseMvc之后,这会导致你的中间件在Mvc完成请求处理后才被触发,但此时HttpContext的用户信息可能已经被后续管道操作影响,或者你的中间件执行时机完全错了。

正确的逻辑是:让MyMiddleware在Mvc处理请求之前进入管道,这样当你调用await _next(httpContext)时,会先执行Mvc的请求处理逻辑,等Mvc处理完成后,再回到你的中间件执行认证后的逻辑——这时候HttpContext.User已经被前面的UseAuthentication中间件正确解析并设置好了。

调整后的Configure方法示例:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) { 
    // ... 其他前置中间件(比如异常处理、静态文件等)

    // 认证中间件必须在Mvc之前注册,这一步你已经做对了
    app.UseAuthentication(); 

    app.UseRequestLocalization(new RequestLocalizationOptions { 
        DefaultRequestCulture = new RequestCulture("en-US"), 
        SupportedCultures = new[] { new CultureInfo("en-US") }, 
        SupportedUICultures = supportedCultures, 
    }); 

    // 将你的中间件移到UseMvc之前
    app.UseMyMiddleware(); // 这里要修正参数问题,下面会说明

    app.UseMvc(); 
}

2. 扩展方法调用的参数不匹配

你定义的UseMyMiddleware扩展方法没有接收额外参数,但调用时却传了ConfigurationManager.ApplicationName,这会直接导致编译错误。如果你的中间件需要这个参数,需要同步修改中间件和扩展方法:

第一步:修改中间件,添加构造参数

public class MyMiddleware { 
    private readonly RequestDelegate _next; 
    private readonly string _appName;

    // 新增appName参数的构造函数
    public MyMiddleware(RequestDelegate next, string appName) { 
        _next = next; 
        _appName = appName;
    } 

    public async Task Invoke(HttpContext httpContext) { 
        await _next(httpContext).ConfigureAwait(false); 
        if (httpContext.User.Identity.IsAuthenticated) 
        { 
            // 这里可以使用_appName执行你的业务逻辑
        } 
    } 
} 

第二步:修改扩展方法,接收并传递参数

public static class MyMiddlewareExtensions { 
    public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder, string appName) { 
        return builder.UseMiddleware<MyMiddleware>(appName); 
    } 
}

第三步:在Configure中正确调用

app.UseMyMiddleware(ConfigurationManager.ApplicationName);

额外验证建议

如果调整顺序后还是无法获取认证用户,可以在MyMiddleware的Invoke方法里添加日志输出,验证两个关键点:

  • 打印httpContext.Request.Headers["Authorization"],确认请求确实携带了有效的Bearer Token
  • 打印httpContext.User.Claims的内容,确认认证中间件是否正确解析了Token并填充了用户信息

这样就能快速排查是Token解析问题,还是中间件顺序的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:45:21