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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:12:52