. NET Core Identity Как установить значение параметра на основе базы данных - PullRequest
0 голосов
/ 20 июня 2020

Мне нужно динамически изменить значение параметра для IdentityOptions из db. Итак, в моем методе ConsigureServices(...) в Startup.cs:

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

я попытался ввести IdentityOptions в свой Configure(...) метод, но безуспешно:

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 Ответ

0 голосов
/ 20 июня 2020

Вы можете попробовать следующее:

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();

ПРИМЕЧАНИЕ. Создание service provider является антипаттерном и приведет к созданию дополнительной копии одноэлементных служб. Я бы посоветовал прочитать конфигурации, например, из appsettings.json, тогда вы можете реализовать его, не создавая service provider

...