Мы переносим старое веб-приложение, написанное на 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);
}
}
}
}
Если кто-то уже решил это, не могли бы вы указать мне правильное направление, пожалуйста?





После дальнейшего изучения источника Abp я обнаружил, что если пользователь не аутентифицирован внешним источником, Abp все равно пытается аутентифицироваться в своей базе данных. Так что это, скорее всего, решит мою проблему:
public class AltAuthSource: DefaultExternalAuthenticationSource<Tenant, User>, ITransientDependency
{
private readonly IRepository<User, long> _userRepository;
private readonly UserManager _userManager;
public override string Name => "AltSource";
public AltAuthSource(IRepository<User, long> userRepository, UserManager userManager)
{
_userRepository = userRepository;
_userManager = userManager;
}
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 || !string.IsNullOrWhiteSpace(user.Password))
{
return Task.FromResult(false);
}
else
{
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);
}
}
}
}
Или я что-то не замечаю?