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"
                    }
                }));
            }
        }
        public async Task <IActionResult> Register([FromBody] Usuario request)
        {
            try
            {
                if (request.PerfilId == null)
                {
                    return(BadRequest("Nenhum Perfil Associado!"));
                }

                request.ForcaTrocaSenha      = true;
                request.DataCriacao          = DateTime.Now;
                request.Logado               = false;
                request.Ativo                = true;
                request.DataUltimaTrocaSenha = DateTime.Now;
                request.DataUltimoLogin      = DateTime.Now;

                var existUser = await _userManager.FindByNameAsync(request.UserName);

                if (existUser == null)
                {
                    var result = await _userManager.CreateAsync(request, request.PasswordHash);

                    if (result.Succeeded)
                    {
                        var perfil = await _roleManager.FindByIdAsync(request.PerfilId.ToString());

                        if (perfil != null)
                        {
                            await _userManager.AddToRoleAsync(request, perfil.Name);
                        }

                        var user = await _userManager.FindByIdAsync(request.Id.ToString());

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

                        _usuarioSenhaHistoryService.Add(usuarioSenhaHistory);

                        return(Ok(new ApiResponseSuccess <Usuario>(user, "Usuário cadastrado com sucesso!")));
                    }
                    else
                    {
                        return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Erro na Criação de Usuários")
                        {
                            Errors = result.Errors.Select(p => p.Description).ToList()
                        }));
                    }
                }
                else
                {
                    return(BadRequest(new ApiResponseError(HttpStatusCode.BadRequest, "Usuário já Existente na base")
                    {
                        Errors = new List <string>()
                        {
                            "Usuário já existente na base"
                        }
                    }));
                }
            }
            catch (Exception ex)
            {
                return(NotFound(new ApiResponseError(HttpStatusCode.BadRequest, "Erro genérico na Criação de Usuários")
                {
                    Errors = new List <string>()
                    {
                        $"Erro: {ex.Message}"
                    }
                }));
            }
        }