.NET 6.0获取当前登录用户信息返回null问题求助
问题根因
获取已登录用户始终返回null是配置错误导致的,核心问题按影响优先级排序:
- 中间件执行顺序完全错误:ASP.NET Core 中间件严格按代码书写顺序执行,你当前将认证、授权中间件放在了路由、CORS中间件之前,请求还未完成路由匹配、CORS校验就进入认证流程,根本无法正确解析请求携带的身份凭证。
- 前后端分离场景下的凭证携带问题:如果前端是独立部署的SPA项目,后端开启
AllowCredentials只是完成了CORS侧的配置,若前端请求未主动配置携带Cookie,认证凭证不会被发送到后端,自然无法识别登录状态。
修复步骤
1. 调整Program.cs的中间件顺序
中间件顺序不能随意调换,将原有中间件配置替换为以下正确顺序即可:
var app = builder.Build(); // 静态文件中间件优先 app.UseStaticFiles(); // 先初始化路由 app.UseRouting(); // CORS配置必须放在认证、授权之前 app.UseCors(x => x .AllowAnyMethod() .AllowAnyHeader() .SetIsOriginAllowed(origin => true) .AllowCredentials()); // 先执行身份认证,再执行权限校验,顺序不可颠倒 app.UseAuthentication(); app.UseAuthorization(); // 最后配置端点映射 app.MapControllerRoute( name: "default", pattern: "{controller}/{action=Index}/{id?}"); app.MapFallbackToFile("index.html"); // 数据库初始化逻辑无需改动 using (var scope = app.Services.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); dbContext.Database.EnsureCreated(); } app.Run();
2. (可选)简化当前用户获取逻辑
ControllerBase基类本身已经携带User属性,不需要额外注入IHttpContextAccessor取当前用户,可以简化接口代码:
[HttpGet] [Route("getCurrentUser")] public async Task<IActionResult> GetCurrentUser() { var user = await _userManager.GetUserAsync(User); if(user == null) { return Unauthorized(); } return Ok(user); }
保留原有注入写法也不会影响功能运行。
3. 前端请求配置校验
如果调整中间件顺序后仍无法获取用户,检查前端请求是否配置了凭证携带:
- 使用axios时,全局配置
axios.defaults.withCredentials = true - 使用原生fetch时,请求参数添加
credentials: 'include'
验证方式
重启项目后先调用登录接口,登录成功后再请求/account/getCurrentUser接口,即可正常返回当前登录的用户实体,不会再出现null的情况。
内容的提问来源于stack exchange,提问作者Kunegundek
相关产品推荐
相关产品推荐

