接入微软身份验证后中间件读取User始终为null但控制器可正常访问
问题原因
核心是ASP.NET Core中间件的执行顺序问题:
- ASP.NET Core的中间件按照注册的先后顺序依次执行,微软身份验证的用户身份填充逻辑封装在
UseAuthentication中间件中,只有该中间件执行完成后,HttpContext.User才会被赋值为当前请求的已认证用户信息。 - 你的自定义中间件注册在了
UseAuthentication、UseAuthorization中间件之前,执行时身份验证逻辑还未运行,所以读取到的User为null。而控制器的执行是在路由匹配、认证、授权全流程完成后才触发,因此可以正常获取用户信息。 - 你通过
IStartupFilter注册的中间件默认会插入到整个管道的最开头,必然早于认证授权中间件,因此也无法读取到用户信息。
解决方案
调整自定义中间件的注册顺序,将其放在 UseAuthentication 和 UseAuthorization 之后,端点映射之前即可,参考注册示例:
// 基础中间件注册 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 先执行认证、授权逻辑,填充User信息 app.UseAuthentication(); app.UseAuthorization(); // 再注册自定义中间件,此时已可正常读取HttpContext.User app.UseMiddleware<CustomMiddleware>(); // 最后注册端点映射 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
注意事项
读取用户信息前建议先判断身份认证状态,避免空引用异常:
if (httpContext.User.Identity?.IsAuthenticated == true) { _logger.LogInformation("当前登录用户:{0}", httpContext.User.Identity.Name); }
内容的提问来源于stack exchange,提问作者Aaron Gibson
相关产品推荐
相关产品推荐

