Как проверить, существует ли адрес электронной почты в таблице AspNetUsers в Asp.Net сердечник

Я следую за образцом в https://docs.asp.net/en/latest/mvc/models/validation.html?highlight=remote#remote-validation
об использовании атрибута Remote:

[AcceptVerbs("Get", "Post")]
public IActionResult VerifyEmail(string email)
{
    if (!_userRepository.VerifyEmail(email))
    {
        return Json(data: $"Email {email} is already in use.");
    }

    return Json(data: true);
}

Как видите, предлагается создать репозиторий с методом VerifyEmail…

Я блуждаю, если я могу использовать UserManager.FindByEmailAsync(string email)
в VerifyEmail контроллера учетных записей вместо реализации репозитория с этим кодом:

var user = context.Users.FirstOrDefault(u => u.Email == email);
return user ? true : false;  

1 ответ

  1. Да вы можете обернуть UserManager в хранилище.

    Я использую его для проверки учетных данных пользователя, как так:

        /// <summary>
        /// Verifies the user password
        /// </summary>
        /// <param name="user"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public async Task<Result<bool>> CheckUserPasswordAsync(User user, string password)
        {
            var result = new Result<bool>();
            try
            {
                result.Data = await _userManager.CheckPasswordAsync(user, password);
            }
            catch (Exception ex)
            {
                result.HandleException(ex, _logger);
            }
            return result;
        }
    

    У меня есть UserService со следующим конструктором, который позволяет мне выполнять действия над пользователями:

        public UserService(
            RoleManager<ApplicationRole> roleManager,
            UserManager<User> userManager,
            SignInManager<User> signInManager,
            ILoggerFactory loggerFactory,
            IRepository repository)
        {
            _roleManager = roleManager;
            _userManager = userManager;
            _signInManager = signInManager;
            _logger = loggerFactory.CreateLogger<IUserService>();
            _repository = repository;
        }
    

    И в стартапе.cs необходимо добавить сущность в метод ConfigureServices:

                    // add identity
                    services.AddIdentity<User, ApplicationRole>()
                            .AddEntityFrameworkStores<BlogCoreContext>();
    

    Вы можете следовать той же логике для вашего метода FindByEmailasync 😉

    Надеюсь, это поможет и счастливое кодирование!