public async Task <IActionResult> Authenticate([FromBody] UserLoginDTO request)
        {
            try
            {
                var user = await _userManager.FindByNameAsync(request.UserName);

                if (user == null)
                {
                    return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Erro na Autenticação do Usuário")
                    {
                        Errors = new List <string>()
                        {
                            "Usuário não reconhecido pela aplicação"
                        }
                    }));
                }

                if (user.Ativo)
                {
                    var result = await _signInManager.PasswordSignInAsync(user, request.Senha, isPersistent : false, lockoutOnFailure : true);

                    if (!result.IsLockedOut)
                    {
                        if (result.Succeeded)
                        {
                            var roles = await _userManager.GetRolesAsync(user);

                            user.Logado          = true;
                            user.DataUltimoLogin = DateTime.Now;
                            await _userManager.UpdateAsync(user);

                            var userAutentication = new UserAutenticationDTO();
                            if (user.ForcaTrocaSenha)
                            {
                                userAutentication.UserName        = user.UserName;
                                userAutentication.DataLogin       = user.DataUltimoLogin;
                                userAutentication.Autenticated    = false;
                                userAutentication.ForcaTrocaSenha = user.ForcaTrocaSenha;
                            }
                            else
                            {
                                var buildToken = TokenHelper.BuildToken(user, roles.ToList(), _appSettings.Auth.JWTSecret, _appSettings.Auth.Expiration);
                                userAutentication.UserName        = user.UserName;
                                userAutentication.DataLogin       = user.DataUltimoLogin;
                                userAutentication.Token           = buildToken;
                                userAutentication.Autenticated    = true;
                                userAutentication.ForcaTrocaSenha = user.ForcaTrocaSenha;
                            }

                            return(Ok(new ApiResponseSuccess <UserAutenticationDTO>(userAutentication, "Usuário Autenticado com sucesso!")));
                        }
                        else
                        {
                            return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Erro na Autenticação do Usuário")
                            {
                                Errors = new List <string>()
                                {
                                    "Usuário ou Senha Inválidos"
                                }
                            }));
                        }
                    }
                    else
                    {
                        return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Erro na Autenticação do Usuário")
                        {
                            Errors = new List <string>()
                            {
                                "Usuário bloqueado por excesso de tentativas (Aguarde 30 Minutos para Tentar Novamente)"
                            }
                        }));
                    }
                }
                else
                {
                    return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Erro na Autenticação do Usuário")
                    {
                        Errors = new List <string>()
                        {
                            "Usuário Desativado, entre em contato com o Administrador para ativação do usuário"
                        }
                    }));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError("Erro ao Autenticar {message}", ex.Message);
                return(NotFound(new ApiResponseError(HttpStatusCode.NotFound, "Erro na Autenticação do Usuário")
                {
                    Errors = new List <string>()
                    {
                        $"Erro ao Autenticar"
                    }
                }));
            }
        }
        public async Task <IActionResult> UpdatePassword([FromBody] UserRedefinicaoSenhaDTO request)
        {
            try
            {
                var user = await _userManager.FindByNameAsync(request.UserName);

                if (user != null)
                {
                    var validarNovaSenha = _passwordValidator.ValidateAsync(_userManager, user, request.NovaSenha);

                    if (!validarNovaSenha.Result.Succeeded)
                    {
                        return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Erro na Modificação da Senha")
                        {
                            Errors = validarNovaSenha.Result.Errors.Select(p => p.Description).ToList()
                        }));
                    }

                    var autenticado = await _signInManager.PasswordSignInAsync(user, request.SenhaAtual, isPersistent : false, lockoutOnFailure : false);

                    if (!autenticado.Succeeded)
                    {
                        return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Usuário ou Senha Inválidos")
                        {
                            Errors = new List <string>()
                            {
                                "Usuário ou Senha Inválidos"
                            }
                        }));
                    }

                    var verificarUltimasSenhas = _usuarioSenhaHistoryService.UltimasSenhas(user.Id, _appSettings.Auth.QtdSenhasVerificar);
                    foreach (var item in verificarUltimasSenhas)
                    {
                        var igualUltimasTres = _passwordHasher.VerifyHashedPassword(null, item.PasswordHash, request.NovaSenha);
                        if (igualUltimasTres == PasswordVerificationResult.Success)
                        {
                            return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Senha não pode ser igual as últimas 3 Senhas válidas")
                            {
                                Errors = new List <string>()
                                {
                                    "Senha não pode ser igual as últimas 3 Senhas válidas"
                                }
                            }));
                        }
                    }

                    var hashPass = _passwordHasher.HashPassword(user, request.NovaSenha);
                    await _userManager.RemovePasswordAsync(user);

                    var result = await _userManager.AddPasswordAsync(user, hashPass);

                    if (result.Succeeded)
                    {
                        user.DataUltimaTrocaSenha = DateTime.Now;
                        user.FirstLogin           = false;
                        user.ForcaTrocaSenha      = false;
                        user.Logado          = true;
                        user.DataUltimoLogin = DateTime.Now;
                        user.PasswordHash    = hashPass;

                        await _userManager.UpdateAsync(user);

                        var usuarioSenhaHistory = new UsuarioSenhaHistory()
                        {
                            UsuarioId    = user.Id,
                            DataCriacao  = DateTime.Now,
                            PasswordHash = user.PasswordHash
                        };

                        _usuarioSenhaHistoryService.Add(usuarioSenhaHistory);

                        var roles = await _userManager.GetRolesAsync(user);

                        var buildToken = TokenHelper.BuildToken(user, roles.ToList(), _appSettings.Auth.JWTSecret, _appSettings.Auth.Expiration);

                        var userAutentication = new UserAutenticationDTO()
                        {
                            UserName        = user.UserName,
                            DataLogin       = user.DataUltimoLogin,
                            Token           = buildToken,
                            Autenticated    = true,
                            ForcaTrocaSenha = false
                        };

                        return(Ok(new ApiResponseSuccess <UserAutenticationDTO>(userAutentication, "Senha Redefina com Sucesso!")));
                    }
                    else
                    {
                        return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Erro na Modificação da Senha")
                        {
                            Errors = result.Errors.Select(p => p.Description).ToList()
                        }));
                    }
                }
                else
                {
                    return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Usuário ou Senha Inválidos")
                    {
                        Errors = new List <string>()
                        {
                            "Usuário ou Senha Inválidos"
                        }
                    }));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError("Erro ao Modificar a Senha {message}", ex.Message);
                return(NotFound(new ApiResponseError(HttpStatusCode.NotFound, "Erro na Troca de Senha")
                {
                    Errors = new List <string>()
                    {
                        $"Erro ao tentar Trocar a Senha"
                    }
                }));
            }
        }