ASP.NET Zero и внешняя проверка подлинности

Мы переносим старое веб-приложение, написанное на 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);
            }
        }
    }
}

Если кто-то уже решил это, не могли бы вы указать мне правильное направление, пожалуйста?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
796
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После дальнейшего изучения источника 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);
            }
        }
    }
}

Или я что-то не замечаю?

Другие вопросы по теме