You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至.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>>这个依赖,就会抛出你看到的异常。

解决方法

只需要在你的服务注册代码中,添加日志服务的注册即可,具体步骤如下:

  1. 在services.AddDbContext(...)之前或之后,添加services.AddLogging(),还可以根据需要配置日志提供者(比如控制台日志)。
  2. 重新构建服务提供者,此时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:25:18