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

ASP Core 2控制器中User始终为null,无法获取登录用户ID求助

解决ASP.NET Core 2中自定义控制器无法获取登录用户ID的问题

我之前也踩过一模一样的坑!在VS2017用默认独立用户账户模板创建的ASP.NET Core 2项目里,Accounts和Manage控制器能正常拿到用户信息,但自己写的控制器里User或者通过_userManager.GetUserAsync(User)拿到的对象总是null,对吧?

问题根源

默认生成的Accounts和Manage控制器已经自带了[Authorize]特性,这个特性会强制ASP.NET Core对请求进行身份验证,验证通过后才会填充User对象。而我们自定义的控制器如果没加这个特性,请求就不会经过身份验证流程,自然拿不到用户信息。

解决方案

1. 给控制器/Action添加[Authorize]特性

这是最关键的一步,直接给你的控制器或者目标Action加上这个特性,确保只有已登录用户能访问,同时触发身份验证流程:

[Authorize]
public class MinerController : Controller
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly YourDbContext _con;

    public MinerController(UserManager<IdentityUser> userManager, YourDbContext con)
    {
        _userManager = userManager;
        _con = con;
    }

    public async Task<int> GetMinerIDAsync()
    {
        var user = await _userManager.GetUserAsync(User);
        if (user == null)
        {
            // 处理用户未登录的情况,比如抛出异常或返回默认值
            throw new UnauthorizedAccessException("请先登录");
        }
        var userId = user.Id;
        // 你的后续查询逻辑
        var miner = await _con.Miners.FirstOrDefaultAsync(x => x.UserId == userId);
        return miner?.Id ?? 0;
    }
}

2. 检查Startup.cs的中间件顺序

确保身份验证中间件在MVC中间件之前运行,否则MVC控制器无法获取已验证的用户信息。在Configure方法里确认顺序:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    // 必须在UseMvc之前调用
    app.UseAuthentication();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

3. 确认测试时已登录

有时候我们测试时可能忘记登录,或者登录会话过期了,导致User为null。先在浏览器里完成登录操作,再访问你的Action。

额外提示

如果你的方法是API接口(不是MVC视图控制器),默认模板的Cookie认证依然有效,但如果是前后端分离的场景,可能需要配置JWT认证,但你的场景是默认模板,所以前面的步骤应该足够解决问题。

内容的提问来源于stack exchange,提问作者el_M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:13:15