ASP Core 2控制器中User始终为null,无法获取登录用户ID求助
解决ASP.NET Core 2中自定义控制器无法获取登录用户ID的问题
我之前也踩过一模一样的坑!在VS2017用默认独立用户账户模板创建的ASP.NET Core 2项目里,Accounts和Manage控制器能正常拿到用户信息,但自己写的控制器里User或者通过_userManager.GetUserAsync(User)拿到的对象总是null,对吧?
问题根源
默认生成的Accounts和Manage控制器已经自带了[Authorize]特性,这个特性会强制ASP.NET Core对请求进行身份验证,验证通过后才会填充User对象。而我们自定义的控制器如果没加这个特性,请求就不会经过身份验证流程,自然拿不到用户信息。
解决方案
1. 给控制器/Action添加[Authorize]特性
这是最关键的一步,直接给你的控制器或者目标Action加上这个特性,确保只有已登录用户能访问,同时触发身份验证流程:
[Authorize] public class MinerController : Controller { private readonly UserManager<IdentityUser> _userManager; private readonly YourDbContext _con; public MinerController(UserManager<IdentityUser> userManager, YourDbContext con) { _userManager = userManager; _con = con; } public async Task<int> GetMinerIDAsync() { var user = await _userManager.GetUserAsync(User); if (user == null) { // 处理用户未登录的情况,比如抛出异常或返回默认值 throw new UnauthorizedAccessException("请先登录"); } var userId = user.Id; // 你的后续查询逻辑 var miner = await _con.Miners.FirstOrDefaultAsync(x => x.UserId == userId); return miner?.Id ?? 0; } }
2. 检查Startup.cs的中间件顺序
确保身份验证中间件在MVC中间件之前运行,否则MVC控制器无法获取已验证的用户信息。在Configure方法里确认顺序:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); // 必须在UseMvc之前调用 app.UseAuthentication(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
3. 确认测试时已登录
有时候我们测试时可能忘记登录,或者登录会话过期了,导致User为null。先在浏览器里完成登录操作,再访问你的Action。
额外提示
如果你的方法是API接口(不是MVC视图控制器),默认模板的Cookie认证依然有效,但如果是前后端分离的场景,可能需要配置JWT认证,但你的场景是默认模板,所以前面的步骤应该足够解决问题。
内容的提问来源于stack exchange,提问作者el_M
相关产品推荐
相关产品推荐

