如何将 UserManager 注入 Program.cs 或 Startup.cs

How to inject UserManager to Program.cs or Startup.cs

这是我的代码的一部分:

public void ConfigureServices(IServiceCollection services)
{
    options.Events = new CookieAuthenticationEvents() {
            OnValidatePrincipal = async (c) =>
            {
                //using (ServiceProvider serviceProvider = builder.Services.BuildServiceProvider()) // ASP0000
                //{
                // var userManager = serviceProvider.GetRequiredService<UserManager<MyUser>>();
                //var myUser = await userManager.GetUserAsync(c.Principal);
                //if (myUser != null && !myUser.EmailConfirmed)
                //{
                //    c.RejectPrincipal();
                //}
                //}
            }
        };
    });
}

当取消注释时它可以工作,但是在 BuildServiceProvider 方法上有一个警告(绿色下划线)说:

ASP0000: Calling BuildServiceProvider from application code results in an additional copy of singleton services being created.

那么在 ConfigureServices 中获取 UserManager 的替代方法是什么? 我无法注入它,因为 ConfigureServices 方法只接受零个或一个参数,必须是 IServiceCollection。

你不应该在处理程序中构建提供者并从中解析某些东西(这绝对不是你想要为每个主体验证做的操作),只需使用它的上下文参数:

new CookieAuthenticationEvents
{
    OnValidatePrincipal = context =>
    {
        var userManager = context.HttpContext.RequestServices.GetRequiredService<UserManager<MyUser>>();
    }
}