Подтвердить что ты не робот

Изменение длины пароля в членстве MVC 5

Попытка изменить минимальную длину пароля по умолчанию на 4 символа. Я знаю, 4!!! Смешно, правильно! Не мой звонок.

Во всяком случае, я изменил его на RegisterViewModel, но это на самом деле не изменило его. Чтобы проиллюстрировать, я опубликовал код ниже. ModleState.IsValid корректно возвращается на основе обновленной ViewModel. Однако затем он вызывает UserManager.CreateAsync(), который возвращает False с сообщением об ошибке "Пароли должны быть не менее 6 символов"

Я следил за шагами в этом, очень похожем сообщении (Изменить пароль...), но он не работает для MVC 5, пока я не был могу сказать. Он по-прежнему возвращает одно и то же сообщение.

//
    // POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName, LastLogin = model.LastLogin };


// This is where it 'fails' on the CreateAsync() call
                    var result = await UserManager.CreateAsync(user, model.Password);
                    if (result.Succeeded)
                    {
                        await SignInAsync(user, isPersistent: false);
                        return RedirectToAction("Index", "Home");
                    }
                    else
                    {
                        AddErrors(result);
                    }
                }
            // If we got this far, something failed, redisplay form
            return View(model);
        }
4b9b3361

Ответ 1

Как вы видите, UserManager имеет общедоступное свойство IIdentityValidator<string> PasswordValidator для проверки пароля, которое в настоящее время инициализируется конструктором UserManager с жестко заданным параметром this.PasswordValidator = (IIdentityValidator<string>) new MinimumLengthValidator(6);.

Вы можете установить это свойство с помощью объекта MinimumLengthValidator с требуемой длиной пароля.

Ответ 2

Вы можете установить свойства пароля с помощью PasswordValidator, найденного в файле IdentityConfig.cs в каталоге App_Start.

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(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 = false,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };

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

        // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
        // You can write your own provider and plug it in here.
        manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<ApplicationUser>
        {
            MessageFormat = "Your security code is {0}"
        });
        manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<ApplicationUser>
        {
            Subject = "Security Code",
            BodyFormat = "Your security code is {0}"
        });
        manager.EmailService = new EmailService();
        manager.SmsService = new SmsService();
        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = 
                new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }
        return manager;
    }

Ответ 3

Проверьте следующую статью в MSDN

Внедрение настраиваемой политики паролей с использованием идентификатора ASP.NET

Предложение состоит в том, чтобы расширить класс UserManager в приложении и установить свойство PasswordValidator в contructor:

public class MyUserManager : UserManager<ApplicationUser>
{
    public MyUserManager() : 
        base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        PasswordValidator = new MinimumLengthValidator(4);
    }
}

И затем в вашем контроллере (или базовом классе контроллеров) создайте экземпляр MyUserManager:

public BaseController() : this(new MyUserManager())
{
}

public BaseController(MyUserManager userManager)
{
  UserManager = userManager;
}

public MyUserManager UserManager { get; private set; }

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