/// <summary> /// Метод создает пользователя. /// </summary> /// <param name="user">Входная модель пользователя.</param> /// <returns>Список ошибок или статус успеха регистрации.</returns> private async Task <IActionResult> CreateUser(UserInput user) { try { IdentityResult errors = null; // Ищет такой email в БД. bool bErrorEmail = await IdentityUserEmail(user.Email); if (!bErrorEmail) { try { // Генерит временный токен для пользователя. string code = await _userManager.GenerateEmailConfirmationTokenAsync(user); // Готовит ссылку, которая будет отображена в письме. string callbackUrl = Url.Action("ConfirmAsync", "User", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme) .Replace("http://localhost:58822", "https://barbuuuda.ru") .Replace("https://barbuuuda.online", "https://barbuuuda.ru"); // Отправит уведомление на email. EmailService emailService = new EmailService(_db); await emailService.SendEmailAsync(user.Email, "Подтверждение регистрации", $"Подтвердите регистрацию на сервисе Barbuuuda, перейдя по ссылке: <a href='{callbackUrl}'>подтвердить</a>"); } // Если почта не существует. catch (Exception ex) { Logger logger = new Logger(_db, ex.GetType().FullName, ex.Message.ToString(), ex.StackTrace); _ = logger.LogCritical(); return(BadRequest(ErrorValidate.EMAIL_NOT_ENTITY)); } // Проставит дату регистрации = текущая дата и время. user.DateRegister = DateTime.UtcNow; // Регистрирует пользователя. IdentityResult oAddedUser = await _userManager.CreateAsync(user, user.UserPassword); // Если регистрация успешна. if (oAddedUser.Succeeded) { // Находит добавленного пользователя и берет его Id. string userId = await _userService.GetLastUserAsync(); // Создаст счет пользователю (по дефолту в валюте RUB). await _postgre.AddAsync(new InvoiceEntity() { UserId = userId, InvoiceAmount = 0, Currency = CurrencyType.CURRENCY_RUB, ScoreNumber = null, ScoreEmail = string.Empty }); await _postgre.SaveChangesAsync(); return(Ok(oAddedUser)); } } // Что-то пошло не так, собирает ошибки запуская цепочку проверок валидации. else { CustomValidatorExtension custom = new CustomValidatorExtension(_postgre); errors = await custom.ValidateAsync(_userManager, user); } return(BadRequest(errors)); } catch (Exception ex) { Logger logger = new Logger(_db, ex.GetType().FullName, ex.Message.ToString(), ex.StackTrace); await logger.LogCritical(); throw new Exception(ex.Message); } }
/// <summary> /// Метод авторизует пользователя. /// </summary> /// <param name="user">Объект данных юзера.</param> /// <returns>Статус true/false</returns> public async Task <object> LoginAsync(UserInput user) { try { SignInResult auth = null; bool isContinue = false; // Проверит, логин передан или email. bool isEmail = CustomValidatorExtension.CheckIsEmail(user.UserName); // Если нужно проверять по логину. if (!isEmail) { // Авторизует юзера. auth = await _signInManager.PasswordSignInAsync(user.UserName, user.UserPassword, user.RememberMe, false); } // Значит в UserName лежит email. else { // Найдет пользователя по почте. UserEntity findUser = await _userManager.FindByEmailAsync(user.UserName); if (findUser != null && findUser.UserPassword.Equals(user.UserPassword)) { isContinue = true; // Перезапишет UserName на логин выбранный из БД для фронта. user.UserName = findUser.UserName; } } // Если авторизация успешна. if ((auth != null && auth.Succeeded) || isContinue) { ClaimsIdentity claim = GetIdentityClaim(user); // Выбирает роли юзера. IEnumerable <string> aRoles = await GetUserRole(user.UserName); // Генерит токен юзеру. string sToken = GenerateToken(claim).Result; return(new { user = user.UserName, userToken = sToken, role = aRoles }); } throw new ArgumentException(); } catch (ArgumentNullException ex) { Logger _logger = new Logger(_db, ex.GetType().FullName, ex.Message.ToString(), ex.StackTrace); await _logger.LogError(); throw new ArgumentNullException("Такого пользователя не существует", ex.Message.ToString()); } catch (ArgumentException ex) { Logger _logger = new Logger(_db, ex.GetType().FullName, ex.Message.ToString(), ex.StackTrace); await _logger.LogError(); throw new ArgumentException("Логин и (или) пароль введены не верно", ex.Message.ToString()); } catch (Exception ex) { Logger _logger = new Logger(_db, ex.GetType().FullName, ex.Message.ToString(), ex.StackTrace); await _logger.LogCritical(); throw new Exception(ex.Message.ToString()); } }