自定义ApplicationUser后Identity依赖注入异常求助
错误信息
处理请求时发生未处理的异常。
InvalidOperationException: 尝试激活'TestApp_03_RazorPage_Identity.Areas.Identity.Pages.Account.RegisterModel'时,无法解析类型为'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]'的服务。
Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)
问题根源
你的错误核心在于RegisterModel中注入的IUserStore<IdentityUser>和IUserEmailStore<IdentityUser>使用了基类IdentityUser,但你在Program.cs里注册的是自定义的ApplicationUser身份类型。DI容器里只有针对ApplicationUser的服务实例,找不到IdentityUser对应的版本,所以激活RegisterModel时会报错。
你的Program.cs、ApplicationUser、ApplicationDbContext和_LoginPartial.cshtml配置都是正确的,问题仅出在RegisterModel的类型匹配上。
修复步骤
1. 修改RegisterModel中的Store类型定义
将RegisterModel里的Store类型从IdentityUser替换为ApplicationUser:
public class RegisterModel : PageModel { private readonly SignInManager<ApplicationUser> _signInManager; private readonly UserManager<ApplicationUser> _userManager; // 把下面两行的IdentityUser改成ApplicationUser private readonly IUserStore<ApplicationUser> _userStore; private readonly IUserEmailStore<ApplicationUser> _emailStore; private readonly ILogger<RegisterModel> _logger; private readonly IEmailSender _emailSender; }
2. 同步修改构造函数参数类型
如果RegisterModel有对应的构造函数注入,确保构造函数里的参数类型也同步替换:
public RegisterModel( SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager, IUserStore<ApplicationUser> userStore, // 这里改成ApplicationUser ILogger<RegisterModel> logger, IEmailSender emailSender) { _signInManager = signInManager; _userManager = userManager; _userStore = userStore; _emailStore = GetEmailStore(); // 如果有这个方法也要同步调整 _logger = logger; _emailSender = emailSender; }
3. 检查CreateUser方法(若存在)
如果RegisterModel里有创建用户的方法,比如CreateUser,也要把返回类型改成ApplicationUser:
private ApplicationUser CreateUser() { return Activator.CreateInstance<ApplicationUser>(); }
修改完成后,DI容器就能正确解析对应的服务,错误即可解决。
内容的提问来源于stack exchange,提问作者dave

