public async Task <ActionResult <UserWithToken> > Login([FromBody] Usuario usuario) { usuario = await _context.Usuarios .Where(u => u.NombreUsuario == usuario.NombreUsuario && u.Password == usuario.Password) .FirstOrDefaultAsync(); UserWithToken userWithToken = null; if (usuario != null) { ActualizarToken actualizartoken = GenerarNuevoToken(); usuario.ActualizarTokens.Add(actualizartoken); await _context.SaveChangesAsync(); userWithToken = new UserWithToken(usuario); userWithToken.RefreshToken = actualizartoken.Token; } if (userWithToken == null) { return(NotFound()); } //Registro del token userWithToken.AccessToken = GenerarAccessToken(usuario.IdUsuario); return(userWithToken); }
/// <summary> /// Actualiza el token de usuario /// </summary> /// <returns></returns> private ActualizarToken GenerarNuevoToken() { ActualizarToken actualizarToken = new ActualizarToken(); var rndNumber = new byte[32]; using (var rng = RandomNumberGenerator.Create()) { rng.GetBytes(rndNumber); actualizarToken.Token = Convert.ToBase64String(rndNumber); } actualizarToken.FechaExpiracion = DateTime.UtcNow.AddMonths(6); return(actualizarToken); }
/// <summary> /// Valida el token de actualización /// </summary> /// <param name="user"></param> /// <param name="refreshToken"></param> /// <returns></returns> private bool ValidateRefreshToken(Usuario user, string refreshToken) { // Compruebo si el token de actualizacion coincide con el id de usuario del token // de actualizacion que ha sido firmado por el cliente ActualizarToken refreshTokenUser = _context.ActualizarTokens.Where(rt => rt.Token == refreshToken) .OrderByDescending(rt => rt.FechaExpiracion) .FirstOrDefault(); // Verifico si el token no es nulo, si pertenece al mismo usuario que recibo por parámetro y si la // fecha de expiración del token es mayor a hoy if (refreshTokenUser != null && refreshTokenUser.IdUsuario == user.IdUsuario && refreshTokenUser.FechaExpiracion > DateTime.UtcNow) { return(true); } return(false); }
/// <summary> /// Metodo para actualizar el token de acceso en caso de que se haya expirado /// </summary> /// <returns></returns> public async Task <bool> callWebApiRefreshToken() { var resultado = false; string refreshToken = Globals.RefreshToken; string user = Globals.IdUser.ToString(); string jwt = Globals.JWT; var peticion = new ActualizarToken(refreshToken, user, jwt); try { using (var cliente = new HttpClient()) { var res = new RespuestaApiObjeto(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; cliente.Timeout = TimeSpan.FromSeconds(timeoutWebApi); var cts = new CancellationTokenSource(); var postBody = JsonConvert.SerializeObject(peticion); var uri = new Uri(string.Format("{0}{1}", url, "Autenticacion/RefreshToken")); var requestContent = new StringContent(postBody, Encoding.UTF8, "application/json"); var response = await cliente.PostAsync(uri, requestContent); var content = await response.Content.ReadAsStringAsync(); Debug.WriteLine(content); res = JsonConvert.DeserializeObject <RespuestaApiObjeto>(content); if (res.statusCode == 200) { ////Se guarda el JWt en Session y el RefreshToken en Cookie RespuestaAutenticacion modeloAprobado = res.respuesta.Datos.ToObject <RespuestaAutenticacion>(); Globals.JWT = modeloAprobado.jwtToken; Globals.RefreshToken = modeloAprobado.refreshToken; Globals.IdUser = res.respuesta.IdRespuesta; resultado = true; } } } catch (Exception ex) { Debug.WriteLine(ex.Message); } return(resultado); }