MVC Core:如何在其他控制器及视图获取当前登录用户的用户名/邮箱
在ASP.NET Core MVC中获取当前登录用户信息的几种方法
嘿,这个问题其实在ASP.NET Core MVC里有好几种简单直接的解决方式,不管你是想在控制器里拿数据传给视图,还是直接在视图里渲染,都能轻松搞定!我给你分场景讲清楚:
一、在控制器中获取用户信息
方法1:直接使用Controller基类的User属性
这是最常用的方式,因为Controller基类已经帮你封装好了User对象,直接用就行。比如在你的StudentController的StudentDetails方法里:
public IActionResult StudentDetails(int id) { // 先判断用户是否已登录(可选,但能避免空值问题) if (User.Identity.IsAuthenticated) { // 获取用户名 var currentUserName = User.Identity.Name; // 获取用户邮箱:默认身份验证会把邮箱存在ClaimTypes.Email这个Claim中 var currentUserEmail = User.FindFirst(System.Security.Claims.ClaimTypes.Email)?.Value; // 你可以通过ViewBag、ViewData或者ViewModel把数据传给视图 ViewBag.UserName = currentUserName; ViewBag.UserEmail = currentUserEmail; } // 你的其他业务逻辑,比如获取学生详情数据... return View(); }
这里要注意FindFirst后面加了?.空安全运算符,避免当用户Claims里没有邮箱信息时出现空引用异常。
方法2:注入IHttpContextAccessor(适合非控制器类或全局访问场景)
如果你需要在服务类或者其他非控制器类中获取用户信息,或者想更灵活地访问HttpContext,可以用这个方式:
- 首先在Program.cs(.NET 6+)中注册服务:
// .NET 6+ 写法 builder.Services.AddHttpContextAccessor();
- 然后在控制器中注入并使用:
private readonly IHttpContextAccessor _httpContextAccessor; // 构造函数注入 public StudentController(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public IActionResult StudentDetails(int id) { var httpContext = _httpContextAccessor.HttpContext; if (httpContext != null && httpContext.User.Identity.IsAuthenticated) { var userName = httpContext.User.Identity.Name; var email = httpContext.User.FindFirst(System.Security.Claims.ClaimTypes.Email)?.Value; // 后续处理逻辑 } return View(); }
二、直接在视图(StudentDetails.cshtml)中获取用户信息
如果你不想通过控制器传数据,也可以直接在视图里访问User对象,写法和控制器里类似:
@if (User.Identity.IsAuthenticated) { <div class="user-info"> <p>当前登录用户名:@User.Identity.Name</p> <p>当前登录用户邮箱:@User.FindFirst(System.Security.Claims.ClaimTypes.Email)?.Value</p> </div> } else { <p>请先登录以查看更多信息</p> }
这样视图就能直接渲染当前登录用户的信息,不用额外在控制器里处理。
小提示
- 确保你的身份验证配置正确,比如使用Identity或者JWT时,已经把用户名、邮箱等信息添加到用户的Claims中,否则可能获取不到对应的值。
- 永远记得先判断
User.Identity.IsAuthenticated,避免未登录状态下获取到null值导致异常。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

