コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
        /// <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());
            }
        }