You need to enable JavaScript to run this app. ASP.NET Core 3.0获取当前登录用户时IdentityUser转MyUser报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 3.0获取当前登录用户时IdentityUser转MyUser报错如何解决

问题原因

你自定义了继承自IdentityUser的MyUser类,但默认UserManager的GetUserAsync方法返回的是IdentityUser基类实例,无法直接隐式转换为子类MyUser,所以触发类型转换报错。

解决方案

步骤1:修正Identity注册配置

确保你注册Identity服务时指定的用户类是自定义的MyUser,而非默认的IdentityUser,以下是.NET 6+ Program.cs的配置示例:

builder.Services.AddDefaultIdentity<MyUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

如果是.NET 5及更早版本,对应修改Startup.cs的ConfigureServices方法中的Identity注册逻辑即可。

步骤2:修正控制器中UserManager的注入类型

控制器里注入的_userManager字段类型需要是UserManager<MyUser>,而非默认的UserManager<IdentityUser>,参考构造函数注入写法:

private readonly UserManager<MyUser> _userManager;
private readonly ApplicationDbContext _context;

public ToDoController(UserManager<MyUser> userManager, ApplicationDbContext context)
{
    _userManager = userManager;
    _context = context;
}

步骤3:调整获取用户的代码(两种可选方案)

方案1:直接获取MyUser实例赋值

完成前两步配置后GetUserAsync将直接返回MyUser类型,原有代码稍作完善即可正常运行:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Description,IsDone")] ToDo toDo)
{
    var user = await _userManager.GetUserAsync(HttpContext.User);
    // 增加空判断避免未登录场景报错
    if (user == null)
    {
        return Challenge();
    }
    if (ModelState.IsValid)
    {
        toDo.User = user;
        _context.Todoes.Add(toDo);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(toDo);
}

方案2:直接赋值用户ID(性能更优,无需额外查询用户表)

你可以给ToDo模型增加外键字段UserId,不用查询整个用户实体即可完成关联:

// 调整后的ToDo模型
public class ToDo
{
    public int Id { get; set; }
    public string Description { get; set; }
    public bool IsDone { get; set; }
    // 新增外键字段
    public string UserId { get; set; }
    public virtual MyUser User { get; set; }
}

对应控制器代码可以简化为:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Description,IsDone")] ToDo toDo)
{
    var userId = _userManager.GetUserId(HttpContext.User);
    if (userId == null)
    {
        return Challenge();
    }
    if (ModelState.IsValid)
    {
        toDo.UserId = userId;
        _context.Todoes.Add(toDo);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(toDo);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 07:30:01