升级至.NET Core 3.0后MS Identity获取UserManager失败问题
解决.NET Core 3.0中获取UserManager时的ILogger依赖异常问题
这个问题我太熟悉了!升级到.NET Core 3.0后,Identity组件的依赖注入逻辑有变化,UserManager现在明确要求注入对应的ILogger实例,而在2.x版本中,框架会隐式帮你注册日志相关服务,所以之前的代码能正常运行。
问题原因
.NET Core 3.0调整了Identity服务的注册逻辑,不再自动包含日志服务的注册。当你手动构建ServiceCollection时,必须显式添加日志服务,否则DI容器无法解析ILogger<UserManager<UserEntity>>这个依赖,就会抛出你看到的异常。
解决方法
只需要在你的服务注册代码中,添加日志服务的注册即可,具体步骤如下:
- 在
services.AddDbContext(...)之前或之后,添加services.AddLogging(),还可以根据需要配置日志提供者(比如控制台日志)。 - 重新构建服务提供者,此时DI容器就能正确解析UserManager的所有依赖了。
修改后的完整代码示例
static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .Build(); var services = new ServiceCollection(); // 显式添加日志服务,这是3.0新增的必要步骤 services.AddLogging(configure => configure.AddConsole()); string connectionString = builder.GetConnectionString("DefaultConnection"); services.AddDbContext<UserDbContext>(options => options.UseSqlServer(connectionString)); services.AddIdentity<UserEntity, GroupEntity>(options => { options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10); options.Password.RequireDigit = true; options.Password.RequiredUniqueChars = 0; options.Password.RequireLowercase = false; options.Password.RequireUppercase = false; options.Password.RequireNonAlphanumeric = false; }) .AddEntityFrameworkStores<UserDbContext>() .AddDefaultTokenProviders(); var provider = services.BuildServiceProvider(); var context = provider.GetService<UserDbContext>(); var userManager = provider.GetService<UserManager<UserEntity>>(); var roleManager = provider.GetService<RoleManager<GroupEntity>>(); }
额外说明
如果你需要更复杂的日志配置(比如文件日志、过滤规则等),可以在AddLogging中进一步扩展,比如:
services.AddLogging(configure => { configure.AddConsole(); configure.AddFile("logs/app.log"); // 需要安装对应的日志包,比如Serilog.Extensions.Logging.File configure.SetMinimumLevel(LogLevel.Information); });
这样修改后,你的代码就能在.NET Core 3.0及以上版本中正常获取UserManager了。
内容的提问来源于stack exchange,提问作者David Tsui
相关产品推荐
相关产品推荐

