如何在ASP.NET Core及MVC项目视图中获取当前IdentityUser信息
嘿,我来分享几个在ASP.NET Core(包括MVC项目)的视图里获取当前登录Identity用户信息的实用方法,都是日常开发里常用的:
User对象 每个视图里都默认可以访问User对象(类型是ClaimsPrincipal),它包含了当前登录用户的所有声明(Claim)信息。默认情况下,ASP.NET Core Identity会把用户的核心信息(比如用户名、用户ID、邮箱)放到Claims里,所以你可以直接这样获取:
- 获取用户名:
@User.Identity.Name - 获取用户ID:
@User.FindFirstValue(ClaimTypes.NameIdentifier) - 获取邮箱:
@User.FindFirstValue(ClaimTypes.Email)
如果你的自定义ApplicationUser里有其他字段想通过Claim获取,记得在用户创建或登录时把这些字段添加到用户的Claims集合里哦。
UserManager<TUser>到视图 如果需要获取完整的IdentityUser(或自定义的ApplicationUser)实体(比如要访问自定义的昵称、生日等字段),可以直接在视图里注入UserManager:
首先在视图顶部添加注入语句:
@inject UserManager<ApplicationUser> UserManager
(如果用的是默认的IdentityUser,就换成UserManager<IdentityUser>)
然后在视图里异步获取用户实体:
@{ var currentUser = await UserManager.GetUserAsync(User); if (currentUser != null) { <div> <p>用户名:@currentUser.UserName</p> <p>邮箱:@currentUser.Email</p> <p>自定义昵称:@currentUser.NickName</p> </div> } }
这种方式适合需要直接访问用户实体字段的场景,不过要注意确保你的项目已经正确配置了Identity服务(比如在Program.cs里添加了builder.Services.AddIdentity<ApplicationUser, IdentityRole>())。
我个人更推荐这种方式,因为它符合MVC的关注点分离原则——控制器负责获取数据,视图只负责展示:
首先在控制器里获取用户信息并封装到ViewModel:
public async Task<IActionResult> Home() { var currentUser = await _userManager.GetUserAsync(User); var homeVm = new HomeViewModel { UserName = currentUser.UserName, Email = currentUser.Email, NickName = currentUser.NickName, RegisterDate = currentUser.RegisterDate }; return View(homeVm); }
然后在视图里使用强类型模型:
@model HomeViewModel <div class="user-info"> <h4>欢迎回来,@Model.UserName</h4> <p>邮箱:@Model.Email</p> <p>注册时间:@Model.RegisterDate.ToString("yyyy-MM-dd")</p> </div>
这种方式让视图更干净,也方便后续的单元测试,避免视图直接依赖UserManager这类服务。
- 如果使用
User.FindFirstValue获取Claim,要确认对应的Claim确实存在于用户的Claims中,不然会返回null; - 视图里使用
await是完全没问题的,ASP.NET Core视图支持异步操作; - 如果你用的是Razor Pages,这些方法也同样适用哦。
内容的提问来源于stack exchange,提问作者rdhainaut

