15

По умолчанию политики паролей ASP.N Co идентичностей требуют, по крайней мере один специального символа, одну заглавной буквы, один номер, ...Как переопределить политики паролей ASP.N Co удостоверений

Как я могу изменить это ограничение?

Там нет ничего о том, что в документации (https://docs.asp.net/en/latest/security/authentication/identity.html)

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

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(
     DbContextOptions<SecurityDbContext> options, 
     IServiceProvider services, 
     IHttpContextAccessor contextAccessor, 
     ILogger<UserManager<ApplicationUser>> logger) 
     : base(
       new UserStore<ApplicationUser>(new SecurityDbContext(contextAccessor)), 
       new CustomOptions(), 
       new PasswordHasher<ApplicationUser>(), 
       new UserValidator<ApplicationUser>[] { new UserValidator<ApplicationUser>() }, 
       new PasswordValidator[] { new PasswordValidator() }, 
       new UpperInvariantLookupNormalizer(), 
       new IdentityErrorDescriber(), 
       services, 
       logger 
      // , contextAccessor 
      ) 
    { 
    } 

    public class PasswordValidator : IPasswordValidator<ApplicationUser> 
    { 
     public Task<IdentityResult> ValidateAsync(UserManager<ApplicationUser> manager, ApplicationUser user, string password) 
     { 
      return Task.Run(() => 
      { 
       if (password.Length >= 4) return IdentityResult.Success; 
       else { return IdentityResult.Failed(new IdentityError { Code = "SHORTPASSWORD", Description = "Password too short" }); } 
      }); 
     } 
    } 

    public class CustomOptions : IOptions<IdentityOptions> 
    { 
     public IdentityOptions Value { get; private set; } 
     public CustomOptions() 
     { 
      Value = new IdentityOptions 
      { 
       ClaimsIdentity = new ClaimsIdentityOptions(), 
       Cookies = new IdentityCookieOptions(), 
       Lockout = new LockoutOptions(), 
       Password = null, 
       User = new UserOptions(), 
       SignIn = new SignInOptions(), 
       Tokens = new TokenOptions() 
      }; 
     } 
    } 
} 

добавить эту менеджер зависимости пользователя в классе стартапа:

services.AddScoped<ApplicationUserManager>(); 

Но когда я использую ApplicationUserManager в контроллерах, у меня есть ошибка: Произошло необработанное исключение при обработке запроса.

InvalidOperationException: Не удается разрешить службу для типа «Microsoft.EntityFrameworkCore.DbContextOptions`1 [SecurityDbContext]» при попытке активировать «ApplicationUserManager».

EDIT: Управление пользователя работает, когда я использовать классы ASP.NET Core удостоверений по умолчанию, так что это не проблема базы данных, или что-то вроде этого

EDIT 2: Я нашел решение, у вас есть просто настроить Identity в классе запуска. Мой ответ дает некоторые подробности.

ответ

48

Это оооочень просто в конце концов ...

Нет необходимости переопределять любой класс, нужно всего лишь настроить параметры идентичности в классе запуска, как это:

services.Configure<IdentityOptions>(options => 
{ 
    options.Password.RequireDigit = false; 
    options.Password.RequiredLength = 5; 
    options.Password.RequireLowercase = true; 
    options.Password.RequireNonLetterOrDigit = true; 
    options.Password.RequireUppercase = false; 
}); 

или вы можно настроить идентичность, когда вы добавляете его:

services.AddIdentity<ApplicationUser, IdentityRole>(options=> { 
       options.Password.RequireDigit = false; 
       options.Password.RequiredLength = 4; 
       options.Password.RequireNonAlphanumeric = false; 
       options.Password.RequireUppercase = false; 
       options.Password.RequireLowercase = false; 
      }) 
       .AddEntityFrameworkStores<SecurityDbContext>() 
       .AddDefaultTokenProviders(); 

AS.NET ядро ​​является окончательно хороший материал ...

+0

Solution добавлена ​​к официальной документации https://docs.asp.net/en/latest/security/authentication/identity.html – AdrienTorris

+3

Применив свое решение, похоже, в ASP. Net Core опция 'options.Password.RequireNonAlphanumeric = false;' была устарела и разделена на 2 "подпараметры": 'options.Password.RequireDigit = false;' и 'options.Password.RequireNonAlphanumeric = false;'. –

0

Вы можете изменить эти правила в файле IdentityConfig.cs. Эти правила определяются в

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 = 5, 
     RequireNonLetterOrDigit = false, 
     RequireDigit = true, 
     RequireLowercase = true, 
     RequireUppercase = true, 
    }; 
}