public async Task <IActionResult> Put([FromBody] LoginModel loginUser)
        {
            if (!AppOptions.AllowedWebLogin)
            {
                return(new ObjectResult(new ServerActionResult()
                {
                    Success = false,
                    Info = "Возможность авторизации через web интерфейс отключена администратором.",
                    Status = StylesMessageEnum.warning.ToString()
                }));
            }

            if (!ModelState.IsValid)
            {
                return(new ObjectResult(new ServerActionResult()
                {
                    Success = false,
                    Info = "Ошибка контроля валидации модели. Контроллер авторизации отклонил запрос.",
                    Status = StylesMessageEnum.danger.ToString(),
                    Tag = ModelState
                }));
            }

            if (AppOptions.IsEnableReCaptchaV2 || AppOptions.IsEnableReCaptchaV2Invisible)
            {
                string privatKey = AppOptions.IsEnableReCaptchaV2Invisible
                    ? AppOptions.reCaptchaV2InvisiblePrivatKey
                    : AppOptions.reCaptchaV2PrivatKey;

                reCaptcha2ResponseModel reCaptcha2Status = reCaptchaVerifier.reCaptcha2SiteVerify(privatKey, loginUser.g_recaptcha_response, HttpContext.Connection.RemoteIpAddress.ToString());

                if (reCaptcha2Status is null || !reCaptcha2Status.success || (reCaptcha2Status.ErrorСodes != null && reCaptcha2Status.ErrorСodes.Length > 0))
                {
                    return(new ObjectResult(new ServerActionResult()
                    {
                        Success = false,
                        Info = "Неудачная попытка входа. Ошибка валидации reCaptcha токена.",
                        Status = StylesMessageEnum.danger.ToString(),
                        Tag = reCaptcha2Status
                    }));
                }
            }

            UserObjectModel user = DbContext.Users.Include(x => x.Department).FirstOrDefault(u => u.Email == loginUser.EmailLogin && u.Password == glob_tools.GetHashString(loginUser.PasswordLogin));//glob_tools.GetHashString

            if (user != null)
            {
                if (user.isDisabled)
                {
                    return(new ObjectResult(new ServerActionResult()
                    {
                        Success = false,
                        Info = "Вход невозможен. Пользователь отключён. Для снятия данного ограничения обратитесь к администратору",
                        Status = StylesMessageEnum.danger.ToString(),
                        Tag = new { user.Name, user.Role, Department = user.Department.Name }
                    }));
                }
                await Authenticate(user);

                return(new ObjectResult(new ServerActionResult()
                {
                    Success = true,
                    Info = "Вход успешно выполнен.",
                    Status = StylesMessageEnum.success.ToString(),
                    Tag = new { user.Name, user.Role, Department = user.Department.Name }
                }));
            }
            else
            {
                return(new ObjectResult(new ServerActionResult()
                {
                    Success = false,
                    Info = "Неверный логин и/или пароль.",
                    Status = StylesMessageEnum.warning.ToString()
                }));
            }
        }
        public async Task <IActionResult> Post([FromBody] RegisterModel regUser)
        {
            if (!AppOptions.AllowedWebRegistration)
            {
                return(new ObjectResult(new ServerActionResult()
                {
                    Success = false,
                    Info = "Регистрация через web интерфейс отключена администратором",
                    Status = StylesMessageEnum.warning.ToString()
                }));
            }

            if (!ModelState.IsValid)
            {
                return(new ObjectResult(new ServerActionResult()
                {
                    Success = false,
                    Info = "Ошибка контроля валидации модели. Регистрация отклонена.",
                    Status = StylesMessageEnum.warning.ToString(),
                    Tag = ModelState
                }));
            }

            if (AppOptions.IsEnableReCaptchaV2 || AppOptions.IsEnableReCaptchaV2Invisible)
            {
                string privatKey = AppOptions.IsEnableReCaptchaV2Invisible
                    ? AppOptions.reCaptchaV2InvisiblePrivatKey
                    : AppOptions.reCaptchaV2PrivatKey;
                reCaptcha2ResponseModel reCaptcha2Status = reCaptchaVerifier.reCaptcha2SiteVerify(privatKey, regUser.g_recaptcha_response, HttpContext.Connection.RemoteIpAddress.ToString());

                if (reCaptcha2Status is null || !reCaptcha2Status.success || (reCaptcha2Status.ErrorСodes != null && reCaptcha2Status.ErrorСodes.Length > 0))
                {
                    return(new ObjectResult(new ServerActionResult()
                    {
                        Success = false,
                        Info = "Неудачная попытка регистрации. Ошибка верификации reCaptcha.",
                        Status = StylesMessageEnum.danger.ToString(),
                        Tag = reCaptcha2Status
                    }));
                }
            }

            if (await DbContext.Users.AnyAsync(u => u.Name.ToLower() == regUser.PublicNameRegister.ToLower()))
            {
                return(new ObjectResult(new ServerActionResult()
                {
                    Success = false,
                    Info = "Неудачная попытка регистрации. Публичное имя используется другим пользователем. Введите другое.",
                    Status = StylesMessageEnum.warning.ToString()
                }));
            }

            UserObjectModel user = DbContext.Users.FirstOrDefault(u => u.Email.ToLower() == regUser.EmailRegister.ToLower());

            if (user != null)
            {
                return(new ObjectResult(new ServerActionResult()
                {
                    Success = false,
                    Info = "Неудачная попытка регистрации. Логин занят. Придумайте другой лгин для входа или воспользуйтесь формой входа.",
                    Status = StylesMessageEnum.warning.ToString()
                }));
            }

            DepartmentObjectModel userDepartment = DbContext.Departments.FirstOrDefault(x => x.Name.ToLower() == "user");

            if (userDepartment is null)
            {
                userDepartment = new DepartmentObjectModel()
                {
                    Name = "user", isReadonly = true
                };
                DbContext.Departments.Add(userDepartment);
                DbContext.SaveChanges();
            }

            user = new UserObjectModel {
                Email = regUser.EmailRegister, Name = regUser.PublicNameRegister, Password = glob_tools.GetHashString(regUser.PasswordRegister), Role = AccessLevelUserRolesEnum.Auth, DepartmentId = userDepartment.Id
            };
            DbContext.Users.Add(user);
            DbContext.SaveChanges();

            await Authenticate(user);

            return(new ObjectResult(new ServerActionResult()
            {
                Success = true,
                Info = "Регистрация успешно завершена",
                Status = StylesMessageEnum.success.ToString(),
                Tag = new { user.Name, user.Role, Department = user.Department.Name }
            }));
        }