ASP.NET Core 5 Identity 如何获取当前已登录用户?
.NET 5 SPA模板控制器获取已登录用户方案
问题根因
.NET 5 自带的React/Angular SPA Identity模板默认使用JWT身份认证,只有触发了认证逻辑的接口,才会解析请求携带的令牌,填充控制器的User对象。你遇到的User无数据的情况,绝大多数是接口未启用认证、或者中间件顺序错误导致的。
具体实现步骤
- 给需要获取用户信息的接口添加认证特性
在控制器类或者对应接口方法上添加[Authorize]特性,引用命名空间Microsoft.AspNetCore.Authorization即可。如果接口上标记了[AllowAnonymous],则会跳过认证逻辑,User始终为空。 - 校验Startup.cs中间件顺序
确保Configure方法中,UseAuthentication(认证中间件)排在UseAuthorization(授权中间件)前面,且两个中间件都放在UseRouting之后、UseEndpoints之前,示例配置如下:public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 省略静态文件、异常处理、CORS等前置中间件 app.UseRouting(); // 注意顺序不可调换:先认证,后授权 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapRazorPages(); }); } - 获取用户信息的两种常用方式
- 直接从
User属性读取声明:// 读取用户ID var userId = User.FindFirstValue(System.Security.Claims.ClaimTypes.NameIdentifier); // 读取用户名 var userName = User.FindFirstValue(System.Security.Claims.ClaimTypes.Name); // 读取用户邮箱 var email = User.FindFirstValue(System.Security.Claims.ClaimTypes.Email); - 注入
UserManager获取完整的用户实体:
首先在控制器构造函数注入UserManager,模板默认使用的用户类是IdentityUser,如果你自定义了用户类,替换为对应的类型即可:[ApiController] [Route("api/[controller]")] [Authorize] public class UserController : ControllerBase { private readonly UserManager<IdentityUser> _userManager; public UserController(UserManager<IdentityUser> userManager) { _userManager = userManager; } [HttpGet("current")] public async Task<IActionResult> GetCurrentUser() { var currentUser = await _userManager.GetUserAsync(User); if (currentUser == null) { return Unauthorized("用户未登录或令牌无效"); } return Ok(new { currentUser.Id, currentUser.UserName, currentUser.Email, currentUser.PhoneNumber }); } }
- 直接从
前端调用注意事项
SPA模板自带的认证模块,会自动给同域的API请求添加Authorization: Bearer {令牌}请求头。如果你自己封装了HTTP请求工具,需要确保请求携带了登录后获取的JWT令牌,否则会触发401错误,User也不会被填充。
内容的提问来源于stack exchange,提问作者Nicholas Bergesen
相关产品推荐
相关产品推荐

