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
相关产品推荐
相关产品推荐

