You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 5 Identity 如何获取当前已登录用户?

.NET 5 SPA模板控制器获取已登录用户方案

问题根因

.NET 5 自带的React/Angular SPA Identity模板默认使用JWT身份认证,只有触发了认证逻辑的接口,才会解析请求携带的令牌,填充控制器的User对象。你遇到的User无数据的情况,绝大多数是接口未启用认证、或者中间件顺序错误导致的。

具体实现步骤

  1. 给需要获取用户信息的接口添加认证特性
    在控制器类或者对应接口方法上添加[Authorize]特性,引用命名空间Microsoft.AspNetCore.Authorization即可。如果接口上标记了[AllowAnonymous],则会跳过认证逻辑,User始终为空。
  2. 校验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();
        });
    }
    
  3. 获取用户信息的两种常用方式
    • 直接从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:24:03