2016-09-23 2 views
0

Поэтому мне нужно импортировать кучу пользователей в мою систему на основе ASP.NET Identity, а некоторые из его паролей очень короткие (всего три символа) и вне моего контроля. Мне нужно импортировать эти пароли, чтобы существующие пользователи могли входить в систему и изменять свои пароли, чтобы соответствовать более жестким требованиям.Требования к паролю для удостоверения личности ASP.NET, переопределяющие мои собственные

Я думал, что, сконфигурировав свойство PasswordValidator в своем классе ApplicationUserManager, я мог бы установить требования к импортированному паролю на низкий номер, что позволило мне импортировать существующего пользователя.

// Configure validation logic for passwords 
appUserManager.PasswordValidator = new PasswordValidator 
{ 
    RequiredLength = 3, 
    RequireNonLetterOrDigit = false, 
    RequireDigit = false, 
    RequireLowercase = false, 
    RequireUppercase = false, 
}; 

Однако, когда я импортировать пользователей и попытаться создать новую запись, я получаю сообщение об ошибке проверки в IdentityResult.

IdentityResult result = manager.Create(newUser, importedUser.Password); 

result.Errors = "Passwords must be at least 6 characters."

Это не возможно отменить требования к идентификации по умолчанию?

Вот весь класс ApplicationUserManager для справки:

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(IUserStore<ApplicationUser> store) 
     : base(store) 
    { 
     PasswordValidator = new MinimumLengthValidator(3); 
    } 

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    { 
     var appDbContext = context.Get<ApplicationDbContext>(); 
     var appUserManager = new ApplicationUserManager(new UserStore<ApplicationUser>(appDbContext)); 

     // Configure validation logic for usernames 
     appUserManager.UserValidator = new UserValidator<ApplicationUser>(appUserManager) 
     { 
      AllowOnlyAlphanumericUserNames = true, 
      RequireUniqueEmail = false 
     }; 

     // Configure validation logic for passwords 
     appUserManager.PasswordValidator = new PasswordValidator 
     { 
      RequiredLength = 3, 
      RequireNonLetterOrDigit = false, 
      RequireDigit = false, 
      RequireLowercase = false, 
      RequireUppercase = false, 
     }; 

     appUserManager.EmailService = new Services.EmailService(); 

     var dataProtectionProvider = options.DataProtectionProvider; 
     if (dataProtectionProvider != null) 
     { 
      appUserManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity")) 
      { 
       //Code for email confirmation and reset password life time 
       TokenLifespan = TimeSpan.FromHours(6) 
      }; 
     } 

     return appUserManager; 
    } 
} 
+0

Я искал свой проект для текста ошибки 'Пароли должны быть не менее X символов' и ​​не могли найти его вообще. Это заставляет меня думать, что это встроенное требование к структуре Identity. – webworm

+0

Можете ли вы показать код до 'IdentityResult result = manager.Create (newUser, importedUser.Password);'? Как вы получили объект 'manager'? – tmg

ответ

0

Проверьте файл web.config, чтобы убедиться, что он не имеет минимальные требования к длине пароля в нем, что переопределяют все остальное.

+0

Спасибо за предложение, но ничего не найдено в файле web.config, относящемся к паролю. – webworm

1

Я нашел проблему. Перечисленный выше класс ApplicationUserManager вызывается из контроллеров API. Однако я пытался импортировать пользователей в базу данных вне API. Поэтому мне нужно было сделать переопределение пароля в методе, где я импортировал пользователей. В частности, где я создал экземпляр manager. Вот пример:

foreach (var user in UserList) 
{ 
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
    manager.PasswordValidator = new MinimumLengthValidator(3); 

    var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); 

    var newUser = new ApplicationUser() 
    { 
     UserName = user.UserName, 
     UserId = user.UserId, 
     Email = user.Email, 
     FirstName = user.FirstName, 
     LastName = user.LastName, 
    }; 


    // Assign the password 
    IdentityResult result = manager.Create(newUser, user.Password); 

    // Assign the role 
    var addedUser = manager.FindByName(user.UserName); 
    manager.AddToRoles(addedUser.Id, new string[] { "User" }); 

} 

Обратите внимание на линии manager.PasswordValidator = new MinimumLengthValidator(3);. Здесь я определяю переопределение пароля. Раньше я помещал пароль в класс ApplicationUserManager, думая, что он будет охватывать все экземпляры создания manager. Решение заключалось в определении переопределения пароля, в котором использовался класс ApplicationUserManager. Извините за сам ответ, но я хотел написать решение в случае, если другие столкнулись с той же проблемой.