Как определить правила паролей для Identity в ASP.NET 5 MVC 6 (vNext)?
Поставщик удостоверений по умолчанию, предоставляемый в ASP.NET 5, имеет очень строгие правила паролей по умолчанию, требуя более строчный символ, символ верхнего регистра, не буквенно-цифровой символ и номер. Я ищу способ изменить требования к паролю для провайдера.
Ранее в ASP.NET 4 поставщик мог быть настроен через XML файл Web.config, как ранее ответил. Однако ASP.NET 5 использует новый шаблон конфигурации на основе кода, и неясно, как настроить идентификатор.
Как я могу изменить требования к паролю для моего приложения?
Ответы
Ответ 1
На самом деле я понял, что вам нужно предоставить AddDefaultIdentity подходящее выражение лямбда, которое настраивает IdentityOptions, который он предоставляет. Это делается внутри метода ConfigureServices в классе Startup, например:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
// Add Identity services to the services container.
services.AddDefaultIdentity<ApplicationIdentityDbContext, ApplicationUser, IdentityRole>(Configuration,
o => {
o.Password.RequireDigit = false;
o.Password.RequireLowercase = false;
o.Password.RequireUppercase = false;
o.Password.RequireNonLetterOrDigit = false;
o.Password.RequiredLength = 7;
});
}
}
Обновление 2:
Выше было верно в бета-версиях фреймворка, в последнем rc1 beta5 он немного изменился:
services.AddIdentity<ApplicationUser, IdentityRole>(o => {
// configure identity options
o.Password.RequireDigit = false;
o.Password.RequireLowercase = false;
o.Password.RequireUppercase = false;
o.Password.RequireNonAlphanumeric = false;
o.Password.RequiredLength = 6;
})
.AddEntityFrameworkStores<ApplicationIdentityDbContext>()
.AddDefaultTokenProviders();
Ответ 2
в startup.cs:
services.AddIdentity<ApplicationUser, IdentityRole>(x =>
{
x.Password.RequiredLength = 6;
x.Password.RequireUppercase = false;
x.Password.RequireLowercase = false;
x.Password.RequireNonAlphanumeric = false;
}).AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
Ответ 3
Если вы создали новый веб-проект с Individual User Accounts
, перейдите по ссылке:
App_Start -> IdentityConfig.cs
Здесь вы можете изменить следующие значения по умолчанию:
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
Ответ 4
Что я хотел сделать, так это настроить правило пароля, чтобы оно содержало символы из как минимум 2 из следующих групп: нижний регистр, верхний регистр, цифры и специальные символы.
Это не то, что я мог бы сделать, просто изменив параметры PasswordValidator:
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = false,
RequireUppercase = false,
};
Поэтому вместо этого я создал пользовательский валидатор, расширив IIdentityValidator...
Сначала создайте новый файл CustomPasswordValidator.cs в папке extensionMethods:
public class CustomPasswordValidator : IIdentityValidator<string>
{
public int RequiredLength { get; set; }
public CustomPasswordValidator(int length) {
RequiredLength = length;
}
public Task<IdentityResult> ValidateAsync(string item) {
if (String.IsNullOrEmpty(item) || item.Length < RequiredLength)
{
return Task.FromResult(IdentityResult.Failed(
String.Format("Password should be at least {0} characters", RequiredLength)));
}
int counter = 0;
List<string> patterns = new List<string>();
patterns.Add(@"[a-z]"); // lowercase
patterns.Add(@"[A-Z]"); // uppercase
patterns.Add(@"[0-9]"); // digits
patterns.Add(@"[[email protected]#$%^&*\(\)_\+\-\={}<>,\.\|""'~`:;\\?\/\[\]]"); // special symbols
foreach (string p in patterns)
{
if (Regex.IsMatch(item, p)) {
counter++;
}
}
if (counter < 2)
{
return Task.FromResult(IdentityResult.Failed(
"Please use characters from at least two of these groups: lowercase, uppercase, digit, secial"));
}
return Task.FromResult(IdentityResult.Success);
}
}
Затем перейдите в IdentityConfig.cs и инициализируйте его в методе Create:
manager.PasswordValidator = new CustomPasswordValidator(6);
/*
// You don't need this anymore
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
*/