ASP.NET Core 6获取当前登录用户ID失败:User始终为Null
ASP.NET Core 6 中 User 始终为 Null 无法获取登录用户ID的解决办法
导致User对象始终为Null,无法获取登录用户ID的常见原因及对应解决办法如下:
1. 认证中间件未正确配置或顺序错误
在Program.cs中必须正确配置认证与授权服务,并且保证中间件的执行顺序正确——UseAuthentication要在UseAuthorization之前,且两者都要放在UseRouting之后。
如果使用JWT认证,配置示例如下:
var builder = WebApplication.CreateBuilder(args); // 添加JWT认证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; }); // 添加授权服务 builder.Services.AddAuthorization(); var app = builder.Build(); // 中间件顺序不能错 app.UseRouting(); app.UseAuthentication(); // 先执行认证 app.UseAuthorization(); // 再执行授权 app.MapControllers(); app.Run();
如果是Cookie认证,替换为AddCookie配置即可,核心是保证中间件顺序正确。
2. 控制器/方法未添加授权特性
只有标记了[Authorize]的控制器或方法,才会触发认证流程,HttpContext中的User对象才会被填充。
修改你的控制器代码,添加[Authorize]特性:
[Route("api/[controller]")] [ApiController] [Authorize] // 添加该特性,强制请求经过认证流程 public class UsersController : ControllerBase { private readonly UserManager<ApplicationUser> _userManager; private readonly ApplicationDbContext _context; private readonly SignInManager<ApplicationUser> _signInManager; public UsersController(UserManager<ApplicationUser> userManager, ApplicationDbContext context, SignInManager<ApplicationUser> signInManager) { _userManager = userManager; _context = context; _signInManager = signInManager; } // 示例接口:获取当前登录用户ID [HttpGet("current-id")] public async Task<IActionResult> GetCurrentUserId() { var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); if (string.IsNullOrEmpty(userId)) { return Unauthorized("未获取到用户认证信息"); } var user = await _userManager.FindByIdAsync(userId); return Ok(new { UserId = userId, UserName = user?.UserName }); } }
如果只是部分方法需要认证,也可以只在对应方法上添加[Authorize]。
3. 请求未携带有效认证凭证
如果是JWT认证,请求头必须包含Authorization: Bearer {你的Token};如果是Cookie认证,要确保请求携带了登录后生成的认证Cookie。
可以通过Postman、浏览器开发者工具等检查请求头,确认认证凭证是否正确携带。
4. 自定义认证逻辑存在问题
如果使用了自定义的认证方案,需要确保在认证Handler中正确将ClaimsPrincipal赋值给HttpContext.User,保证用户的Claims信息被正确填充。
内容的提问来源于stack exchange,提问作者Rain
相关产品推荐
相关产品推荐

