Изменение длины пароля в членстве 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);
}
Ответы
Ответ 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
и заменяя валидатор по умолчанию.