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" } })); } }