Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }