2016-05-25 4 views
0

Я изучаю MVC и для создания входа и регистрации с использованием пользовательской существующей базы данных Я следовал this tutorial и создал пользовательский диспетчер пользователей и диспетчер входа. Это позволило мне правильно зарегистрировать пользователя и правильно сохранить пользователей в моем db. Но пароль сохраняется как строка без шифрования, так как пользователь вводит его в, а также во время входа в систему CheckPasswordAsync возвращает System.FormatException: недопустимая длина для массива или строки char-Base. Для реализации UserPasswordStore я последовал this tutorial код для моего пользовательского signinmanager и магазин ПользовательНедопустимая длина массива символов или строки Base-64. в UserManager.CheckPasswordAsync (пользователь, пароль)

public class CustomUserManager : UserManager<MyAppUser> 
{ 
    public CustomUserManager(IUserStore<MyAppUser> store) : base(store) { } 

    internal static CustomUserManager Create() 
    { 
     return new CustomUserManager(new CustomUserStore()); 
    } 

    public override Task<bool> CheckPasswordAsync(MyAppUser user, string password) 
    { 
     return base.CheckPasswordAsync(user, password); 
    } 
} 

public class CustomUserStore : IUserStore<MyAppUser>, IUserPasswordStore<MyAppUser> 
{ 
    private LearningDBContext database; 

    public Task CreateAsync(MyAppUser user) 
    { 
     try 
     { 
      var context = userStore.Context as LearningDBContext; 
      context.MyAppUsers.Add(user); 
      context.Configuration.ValidateOnSaveEnabled = false; 
      return context.SaveChangesAsync(); 
     } 
     catch { } 
     return Task.FromResult<bool>(true); 
    } 

    #endregion 


    #region Password Store Region 
    public Task SetPasswordHashAsync(MyAppUser user, string passwordHash) 
    { 
     var identityUser = ToIdentityUser(user); 
     var task = userStore.HasPasswordAsync(identityUser); 
     setMyAppUser(user, identityUser); 
     return Task.FromResult(0); 
    } 

    private void setMyAppUser(MyAppUser user, IdentityUser identityUser) 
    { 
     user.Password = identityUser.PasswordHash; 
     user.Id = identityUser.Id; 
     user.UserName = identityUser.UserName; 
    } 

    public Task<string> GetPasswordHashAsync(MyAppUser user) 
    { 
     var identityUser = ToIdentityUser(user); 
     var task = userStore.GetPasswordHashAsync(identityUser); 
     setMyAppUser(user, identityUser); 
     return task; 
    } 

    public Task<bool> HasPasswordAsync(MyAppUser user) 
    { 
     var identityUser = ToIdentityUser(user); 
     var task = userStore.HasPasswordAsync(identityUser); 
     setMyAppUser(user, identityUser); 
     return task; 
    } 

    private IdentityUser ToIdentityUser(MyAppUser user) 
    { 
     return new IdentityUser() 
     { 
      Id = user.Id, 
      PasswordHash = user.Password, 
      UserName = user.UserName 
     }; 
    } 
    #endregion 
} 

и в контроллере я звоню

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false); 

Я не могу понять причину. Может ли кто-нибудь помочь?

+0

Не могли бы вы уменьшить код до минимума, необходимого для воспроизведения проблемы? –

+0

Я отредактировал код так, чтобы остались только необходимые части. Но при его реализации остальные функции будут генерироваться автоматически Visual Studio. – Rohit

+0

@Rohit этот «пароль сохраняется как строка без шифрования» заставляет меня волноваться. Почему ты делаешь это? Вы получаете эту ошибку, когда пароль hasher ожидает пароль, сохраненный как хеш в формате Base64, но вместо строки Base64 вы даете ему простой текст. – trailmax

ответ

0

Благодаря помощи @trailmax я смог решить эту проблему. Я сохранял пароль напрямую и, поскольку я использовал реализацию по умолчанию без переопределения системы, проверял пароль хэширования. Таким образом, мне нужно было либо сохранить хешированный пароль, либо переопределить метод CheckPassword для проверки вручную. Он работает в обоих направлениях.