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

