Динамически изменять настройки PasswordValidator Asp.net Mvc - PullRequest
0 голосов
/ 11 октября 2018

Я управляю разными клиентами в своем приложении, и все клиенты используют одно и то же приложение mvc.Но мне нужно изменить логику проверки пароля в зависимости от клиента.

Я создал политику паролей по умолчанию в IdentityConfig.cs. Создайте метод, как показано ниже:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
        var manager = new ApplicationUserManager(context.Get<ApplicationDbContext>());
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };

        // Configure validation logic for passwords
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = true,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };

        // Configure user lockout defaults
        manager.UserLockoutEnabledByDefault = true;
        manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
        manager.MaxFailedAccessAttemptsBeforeLockout = 5;

        return manager;
    }

Но мне нужно управлять специфичным для клиента PasswordValidator.Я получаю текущего клиента из субдомена, я имею в виду, если мой URL http://example.com/customer1, тогда я знаю, что это customer1 и получаю настройки политики паролей из базы данных.Я беру эти настройки в переменную сессии.Могу ли я использовать переменные Session в методе IdentityConfig Create или как я могу переопределить свойства PasswordValidator после создания сеанса?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я столкнулся с подобной проблемой при определении моих валидаторов в менеджере.Как только это будет сделано, они больше не будут корректироваться.

В конце я создал отдельную функцию, где получил политики и применил их к IdentityOpions.После этого я могу создать свои валидаторы с этими опциями и добавить их в менеджер.Похоже, что валидаторы принимают параметры в качестве значений по умолчанию, а не позволяют настраивать их на лету.

public class ApplicationUserManager : UserManager<ApplicationUser>
{
   internal void SetPolicies(Dictionary<string, string> passwordPolicies)
   { // do stuff in a loop, like getting the policies like this:
   Options.Password.RequireDigit = policy.value;

   // Then create and add the validator with the new policies in place.
    _passwordValidator = new PasswordValidator<ApplicationUser>();
   this.PasswordValidators.Add(_passwordValidator);
   }
}
0 голосов
/ 11 октября 2018

Вы можете создать свой собственный валидатор паролей, расширив IIdentityValidator:

// your first validator logic
public class CustomPasswordValidator1: IIdentityValidator<string>
{
    public CustomPasswordValidator1(int length)
    {
        RequiredLength = length;
    }

    public int RequiredLength { get; set; }

    public Task<IdentityResult> ValidateAsync(string password)
    {
        // write your own validation logic here
        if (string.IsNullOrEmpty(password) || password.Length < RequiredLength)
        {
            return Task.FromResult(IdentityResult.Failed("bad password"));
        }

        // good password            
        return Task.FromResult(IdentityResult.Success);
    }
}

// your second validator logic
public class CustomPasswordValidator2: IIdentityValidator<string>
{
    public CustomPasswordValidator2(int length)
    {
        RequiredLength = length;
    }

    public int RequiredLength { get; set; }

    public Task<IdentityResult> ValidateAsync(string password)
    {
        // write some other validation logic
    }
}

См. Здесь для получения дополнительной информации о том, как продлить IIdentityValidator


Теперь, когда у вас есть CustomPasswordValidator1 и CustomPasswordValidator2, вы можете изменить свой код ApplicationUserManager и использовать правильную логику валидатора:

 public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
 {
    var manager = new ApplicationUserManager(new CustomUserStore(context.Get<ApplicationDbContext>()));

    manager.UserValidator = new UserValidator<ApplicationUser, long>(manager)
    {
        AllowOnlyAlphanumericUserNames = false,
        RequireUniqueEmail = true
    };
    if (/* some condition */)
    {
        manager.PasswordValidator = new CustomPasswordValidator1(6 /*min length*/ );
    }
    else 
    {
        manager.PasswordValidator = new CustomPasswordValidator2(12 /*min length*/);
    }
    // more code...
...