ASP.NET Core MVC登录成功跳转后User.Identity为null问题
核心问题是中间件配置缺失+顺序错误。
ASP.NET Core Identity的身份认证流程依赖UseAuthentication()中间件:只有该中间件执行时,才会读取请求携带的身份认证Cookie,解析声明信息填充HttpContext.User对象,后续的授权逻辑、控制器、视图中才能通过User属性拿到已登录用户的信息。
你当前的中间件管道只配置了UseAuthorization(),完全没有添加UseAuthentication()中间件,所以即使登录成功Cookie已经正常下发到浏览器,后续跳转的请求携带Cookie到达服务端时,没有组件负责解析Cookie填充用户身份,User.Identity下的所有属性自然都会返回null。
调整中间件管道配置,严格按照顺序在UseRouting()之后、UseAuthorization()之前补充app.UseAuthentication();配置,修正后的中间件代码如下:
app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 补充认证中间件,顺序不可调换:必须先完成身份认证,再执行权限校验 app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
额外注意:你当前登录代码中
PasswordSignInAsync的第一个参数传入的是用户邮箱,而该方法默认要求第一个参数为用户的UserName字段值。如果注册用户时UserName和邮箱不一致,会出现登录失败、或者后续User.Identity.Name取值和预期邮箱不符的问题,建议登录时先通过邮箱查询到对应用户对象,再传入用户名执行登录操作,不过该问题不会导致User.Identity.Name为null。
修改完成后重启应用,重新登录即可在控制器和布局页中正常获取到登录用户信息。
内容的提问来源于stack exchange,提问作者Talkhak1313

