0

这是我的代码的一部分:

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:从应用程序代码调用 BuildServiceProvider 会导致创建单例服务的附加副本。

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

4

1 回答 1

3

您不应该在处理程序中构建提供程序并从中解决某些问题(这绝对不是您要为每个主体验证执行的操作),只需使用它的上下文参数:

new CookieAuthenticationEvents
{
    OnValidatePrincipal = context =>
    {
        var userManager = context.HttpContext.RequestServices.GetRequiredService<UserManager<MyUser>>();
    }
}
于 2022-01-14T12:31:18.897 回答