Сделать основные параметры Identtiy настраиваемыми с базой данных - PullRequest
0 голосов
/ 17 декабря 2018

Я новичок в ядре aspnet.мы используем тождественное ядро ​​2.1.Теперь сделана страница, откуда администратор может установить другую конфигурацию, например, повторные попытки блокировки в режиме ожидания.Эти настройки сохраняются в таблице базы данных.Теперь я хочу, чтобы моя опция идентичности была установлена ​​из этих значений.Я сделал репозиторий, чтобы получить настройки из базы данных.но я не могу вызвать эту функцию хранилища из файла startup.cs.

Может, кто-нибудь мне поможет?А также скажите мне лучший способ сделать параметры идентичности настраиваемыми из базы данных.

Я создал службу

public class SecuritySettingService : ISecuritySettingService
{
    private readonly ISecuritySettingRepository _securitySettingRepository;
    public SecuritySettingService(ISecuritySettingRepository securitySettingRepository)
    {
        _securitySettingRepository = securitySettingRepository;
    }
    public SecuritySetting GetSecuritySetting()
    {
       return  _securitySettingRepository.GetSecuritySetting();
    }
}

Репозиторий для подключения к базе данных

public class SecuritySettingRepository : ISecuritySettingRepository
{
    private readonly IDbRepository _dapperWrapper;
    public SecuritySettingRepository(IDbRepository dapperWrapper)
    {
        _dapperWrapper = dapperWrapper;
    }
    public SecuritySetting GetSecuritySetting()
    {
        var response = _dapperWrapper.QuerySingleOrDefault<SecuritySetting>("security_setting_get", null, CommandType.StoredProcedure);

        return response;
    }
}

Создан класс конфигурации идентификации для очистки startup.cs

public static class IdentityConfig {public static void ConfigureIdentity (IServiceCollection services, ISecuritySettingService securitySettingService) {

        var securitySetting = securitySettingService.GetSecuritySetting();
        services.AddIdentity<ApplicationUser, ApplicationRole>(options => {
            options.Password.RequireDigit = true;
            options.Password.RequiredLength = 8;
            options.Password.RequireNonAlphanumeric = true;
            options.Password.RequireUppercase = true;
            options.Password.RequireLowercase = true;


        }).AddUserManager<CustomUserManager>().AddDefaultTokenProviders();





        services.Configure<IdentityOptions>(options =>
        {
            // Default User settings.
            options.User.AllowedUserNameCharacters =
                    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
            options.User.RequireUniqueEmail = true;


        });

        services.Configure<DataProtectionTokenProviderOptions>(options =>
        {
            options.TokenLifespan = TimeSpan.FromDays(30);
        });

        services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromHours(1);
            options.LoginPath = "/login";
            options.LogoutPath = "/logout";
            options.Cookie = new CookieBuilder
            {
                IsEssential = true // required for auth to work without explicit user consent; adjust to suit your privacy policy
            };
        });

    }
}

файл startup.cs похож на

public class Startup
{
    public ISecuritySettingService _securitySettingService;
    public Startup(IConfiguration configuration, ISecuritySettingService securitySettingService)
    {
        Configuration = configuration;
        _securitySettingService = securitySettingService;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {



        IdentityConfig.ConfigureIdentity(services, _securitySettingService);


        services.AddOptions();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");

        services.AddHttpContextAccessor();

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {

    }
}

в файле startup.cs, когда я вызываю IdentityConfig.ConfigureIdentity (services, _securitySettingService);объект _securitySettingService отсутствует, поэтому мой код выдает исключительную недопустимую операцию

1 Ответ

0 голосов
/ 18 декабря 2018

Для вашей текущей ошибки вы зарегистрировали ISecuritySettingService и использовали ее в Startup.Для ссылки ISecuritySettingService вам необходимо сначала зарегистрировать ее.

Для services.Configure<IdentityOptions> оно не изменится автоматически при изменении базы данных.Вам необходимо обновить IdentityOptions самостоятельно.

Следуйте инструкциям ниже и измените их при необходимости.

  1. ISecuritySettingRepository

    public interface ISecuritySettingRepository
    {
        LockoutOption GetSecuritySetting();
        LockoutOption UpdateSecuritySetting(LockoutOption lockoutOption);
    }
    
  2. SecuritySettingRepository

    public class SecuritySettingRepository : ISecuritySettingRepository
    {
        private readonly DbConnection _dapperWrapper;
        private readonly IConfiguration _configuration;
    
        public SecuritySettingRepository(DbConnection dapperWrapper
            , IConfiguration configuration)
        {
            _dapperWrapper = dapperWrapper;
            _configuration = configuration;
        }
        public LockoutOption GetSecuritySetting()
        {
            using (var connection = new SqlConnection(_configuration.GetConnectionString("DefaultConnection")))
            {
                string sQuery = "SELECT top 1 * From LockoutOption Where Id = 1";
                var response = connection.QueryFirstOrDefault<LockoutOption>(sQuery);
                return response;
            }
        }
    
        public LockoutOption UpdateSecuritySetting(LockoutOption lockoutOption)
        {
            using (var connection = new SqlConnection(_configuration.GetConnectionString("DefaultConnection")))
            {
                string sQuery = $"Update LockoutOption Set MaxFailedAccessAttempts = {lockoutOption.MaxFailedAccessAttempts} Where Id = {lockoutOption.Id}";
                var result = connection.Execute(sQuery);
                string sQuery1 = "SELECT top 1 * From LockoutOption Where Id = 1";
                var response = connection.QueryFirstOrDefault<LockoutOption>(sQuery1);
    
                return response;
            }
        }
    }
    
  3. ISecuritySettingService

    public interface ISecuritySettingService
    {
        LockoutOption GetSecuritySetting();
        LockoutOption UpdateSecuritySetting(LockoutOption lockoutOption);
    }
    
  4. SecuritySettingService

    public class SecuritySettingService : ISecuritySettingService
    {
        private readonly ISecuritySettingRepository _securitySettingRepository;
        private readonly IdentityOptions _identityOptions;
    
        public SecuritySettingService(ISecuritySettingRepository securitySettingRepository
            , IOptions<IdentityOptions> identityOptions)
        {
            _securitySettingRepository = securitySettingRepository;
            _identityOptions = identityOptions.Value;
        }
        public LockoutOption GetSecuritySetting()
        {
            return _securitySettingRepository.GetSecuritySetting();
        }
    
        public LockoutOption UpdateSecuritySetting(LockoutOption lockoutOption)
        {
            var option = _securitySettingRepository.UpdateSecuritySetting(lockoutOption);
            //update identity options
            _identityOptions.Lockout.MaxFailedAccessAttempts = option.MaxFailedAccessAttempts;
            return option;
        }
    }
    
  5. Зарегистрироваться в Startup

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<DbConnection>(serviceProvider => new DbConnection(Configuration.GetConnectionString("DefaultConnection")));
            services.AddMvc();
            // your rest configure services
    
            services.AddTransient<ISecuritySettingService, SecuritySettingService>();
            services.AddTransient<ISecuritySettingRepository, SecuritySettingRepository>();
            var _ecuritySettingService = services.BuildServiceProvider().GetRequiredService<ISecuritySettingService>();
            services.Configure<IdentityOptions>(options =>
            {
                options.Lockout.MaxFailedAccessAttempts = _ecuritySettingService.GetSecuritySetting()?.MaxFailedAccessAttempts ?? 3;
            });
        }
    
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //your configure
        }
    }
    
  6. Использование

    namespace DapperPro.Controllers
    {
        public class LockoutOptionsController : Controller
        {
            private readonly ApplicationDbContext _context;
            private readonly IdentityOptions _identityOptions;
            private readonly ISecuritySettingService _securitySettingService;
            public LockoutOptionsController(ApplicationDbContext context
                , IOptions<IdentityOptions> identityOptions
                , ISecuritySettingService securitySettingService)
            {
                _context = context;
                _identityOptions = identityOptions.Value;
                _securitySettingService = securitySettingService;
            }        
    
            // POST: LockoutOptions/Edit/5
            // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
            // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
            [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<IActionResult> Edit(int id, [Bind("Id,AllowedForNewUsers,MaxFailedAccessAttempts,DefaultLockoutTimeSpan")] LockoutOption lockoutOption)
            {
                _securitySettingService.UpdateSecuritySetting(lockoutOption);
    
                return View(lockoutOption);
            }        
        }
    }
    
...