.NET Core 无需添加Identity注入UserManager遇DI错误
问题分析与解决方案
直接注册UserManager<CustomIdentityUser>会触发依赖注入错误,因为UserManager并非独立类,它依赖IUserStore<CustomIdentityUser>、IPasswordHasher<CustomIdentityUser>等多个底层服务,仅通过AddScoped无法自动填充这些依赖。
你需要注册UserManager所需的核心依赖,但无需引入完整的Identity认证方案,具体步骤如下:
1. 确保DbContext继承正确
你的CustomIdentityDbContext必须继承IdentityDbContext<CustomIdentityUser>,以提供Identity用户表的结构支持:
public class CustomIdentityDbContext : IdentityDbContext<CustomIdentityUser> { public CustomIdentityDbContext(DbContextOptions<CustomIdentityDbContext> options) : base(options) { } // 若有自定义用户属性,可在此配置实体映射 }
2. 修改服务注册代码
替换原有的AddScoped<UserManager<...>>,改用AddIdentityCore注册核心服务(不含认证中间件):
builder.Services.AddDbContext<CustomIdentityDbContext>(opt => { opt.UseSqlServer(builder.Configuration.GetConnectionString("SomeDb")); }); // 注册Identity核心服务(仅包含UserManager、UserStore等,不添加认证方案) builder.Services.AddIdentityCore<CustomIdentityUser>(options => { // 按需配置密码规则,示例为简化规则 options.Password.RequireDigit = false; options.Password.RequireLowercase = false; options.Password.RequireUppercase = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequiredLength = 6; }) .AddEntityFrameworkStores<CustomIdentityDbContext>(); // 关联EF作为用户存储实现
3. 保持控制器注入不变
你的TenantController注入代码无需修改,AddIdentityCore已自动将UserManager<CustomIdentityUser>注册为Scoped服务:
private readonly UserManager<CustomIdentityUser> _userManager; public TenantController(UserManager<CustomIdentityUser> userManager) { _userManager = userManager; }
这样配置后,就能正常使用UserManager的方法(比如CreateAsync插入用户),同时不会引入项目不需要的Identity认证方案。
内容的提问来源于stack exchange,提问作者Tuğba Sivri
相关产品推荐
相关产品推荐

