提问者:小点点

。NET Core Identity如何基于数据库设置选项值


我需要从DB动态更改identityoptions的参数值。 因此,在startup.cs中的ConsugureVices(。。。)方法中:

services.AddIdentity<AppUser, IdentityRole>(option =>
{
    option.Lockout.MaxFailedAccessAttempts = 3; // I need to set this value dynamically from database when server starts
}).AddEntityFrameworkStores<DataContext>()
  .AddDefaultTokenProviders();

我尝试在configure(。。。)方法中插入identityoptions,但没有成功:

public void Configure(
    IApplicationBuilder app,
    DataContext dataContext,
    IdentityOptions identityOptions)
{
    var sysPolicy = dataContext.SysPolicy.FirstOrDefault();
    identityOptions.Lockout.MaxFailedAccessAttempts = sysPolicy.DisablePwdLoginFail;
}

它会抛出这样的异常(似乎我无法将其注入到我的Configure中):

System.Exception: Could not resolve a service of type 'Microsoft.AspNetCore.Identity.IdentityOptions' for the parameter 'identityOptions' of method 'Configure' on type 'App.Startup'.

共1个答案

匿名用户

您可以尝试以下操作:

services.AddIdentity<AppUser, IdentityRole>(
                    options =>
                    {
                        var scopeFactory = services.BuildServiceProvider().GetRequiredService<IServiceScopeFactory>();

                        using var scope = scopeFactory.CreateScope();
                        var provider = scope.ServiceProvider;
                        using var dataContext = provider.GetRequiredService<DataContext>();
                        options.Lockout.MaxFailedAccessAttempts = dataContext.SysPolicy.FirstOrDefault();
                    })
                .AddEntityFrameworkStores<DataContext>()
                .AddDefaultTokenProviders();

注意:构建服务提供程序是一个反模式,将导致创建一个单独服务的附加副本。 例如,我建议从appsettings.json中读取配置,这样就可以实现它,而无需构建服务提供程序