Мы переносим старое веб-приложение, написанное на Node.js, в ASP.NET Zero.Мы должны сохранить всех пользователей и их пароли, чтобы они все еще могли войти в систему.Пароли хешируются с помощью bcrypt.
План следующий: когда пользователь входит в систему впервые после миграции, мы авторизируем его / ее для пароля brypt и, если пароль действителен, мы хешируем его, используя _userManager.PasswordHasher.HashPassword(user, plainPassword)
и сохраните его как свой пароль.В следующий раз, когда этот пользователь захочет войти в систему, для этого будут вызваны стандартные функции ASP.NET Zero.
Первая часть - bcrypt работает довольно хорошо, но я не могу понять, как использовать стандартный механизм для аутентификации пользователя.,Вот что у меня есть:
private readonly IRepository<User, long> _userRepository;
private readonly SignInManager<User> _signInManager;
private readonly UserManager _userManager;
public AltAuthSource(IRepository<User, long> userRepository, UserManager userManager, SignInManager<User> signInManager)
{
_userRepository = userRepository;
_userManager = userManager;
_signInManager = signInManager;
}
public override Task<bool> TryAuthenticateAsync(string userNameOrEmailAddress, string plainPassword, Tenant tenant)
{
var user = _userRepository.GetAll().FirstOrDefault(x => x.UserName.Equals(userNameOrEmailAddress, StringComparison.InvariantCultureIgnoreCase) || x.EmailAddress.Equals(userNameOrEmailAddress, StringComparison.InvariantCultureIgnoreCase));
if (user == null)
{
return Task.FromResult(false);
}
else
{
if (string.IsNullOrWhiteSpace(user.Password))
{
var passwordOk = BCrypt.Net.BCrypt.Verify(plainPassword, user.PasswordOrig);
if (passwordOk)
{
_userManager.ResetAccessFailedCountAsync(user);
var newHash = _userManager.PasswordHasher.HashPassword(user, plainPassword);
user.Password = newHash;
return Task.FromResult(true);
}
else
{
_userManager.AccessFailedAsync(user);
return Task.FromResult(false);
}
}
else
{
var passwordOk = _signInManager.PasswordSignInAsync(user, plainPassword, false, false);
if (passwordOk.Result.Succeeded)
{
_userManager.ResetAccessFailedCountAsync(user);
return Task.FromResult(true);
}
else
{
_userManager.AccessFailedAsync(user);
return Task.FromResult(false);
}
}
}
}
Если кто-нибудь уже решил это, не могли бы вы указать мне правильное направление, пожалуйста?