Example #1
0
        private AccessDataDTO GenerateToken(string userID, SigningConfigurationsDTO signingConfigurations, TokenConfigurationsDTO tokenConfigurations, IDistributedCache cache)
        {
            ClaimsIdentity identity = new ClaimsIdentity(
                new GenericIdentity(userID, "IDUsuario"),
                new[] {
                new Claim("IDUsuario", userID)
            }
                );

            DateTime dataCriacao   = DateTime.Now;
            DateTime dataExpiracao = dataCriacao + TimeSpan.FromSeconds(tokenConfigurations.Seconds);

            // Calcula o tempo máximo de validade do refresh token
            // (o mesmo será invalidado automaticamente pelo Redis)
            TimeSpan finalExpiration = TimeSpan.FromSeconds(tokenConfigurations.FinalExpiration);

            var handler       = new JwtSecurityTokenHandler();
            var securityToken = handler.CreateToken(new SecurityTokenDescriptor
            {
                Issuer             = tokenConfigurations.Issuer,
                Audience           = tokenConfigurations.Audience,
                SigningCredentials = signingConfigurations.SigningCredentials,
                Subject            = identity,
                NotBefore          = dataCriacao,
                Expires            = dataExpiracao
            });
            var token = handler.WriteToken(securityToken);

            AccessDataDTO resultado = new AccessDataDTO();

            resultado.AccessToken  = token;
            resultado.RefreshToken = Guid.NewGuid().ToString().Replace("-", String.Empty);
            resultado.Created      = dataCriacao.ToString("yyyy-MM-dd HH:mm:ss");
            resultado.Expiration   = dataExpiracao.ToString("yyyy-MM-dd HH:mm:ss");

            // Armazena o refresh token em cache através do Redis
            var refreshTokenData = new RefreshTokenDataDTO();

            refreshTokenData.RefreshToken = resultado.RefreshToken;
            refreshTokenData.IDUsuario    = userID;

            DistributedCacheEntryOptions opcoesCache = new DistributedCacheEntryOptions();

            opcoesCache.SetAbsoluteExpiration(finalExpiration);
            cache.SetString(resultado.RefreshToken, JsonConvert.SerializeObject(refreshTokenData), opcoesCache);
            return(resultado);
        }
Example #2
0
        public IActionResult PostLogin([FromBody] LoginDTO login,
                                       [FromServices] UsuariosDAO usuariosDAO,
                                       [FromServices] SigningConfigurationsDTO signingConfigurations,
                                       [FromServices] TokenConfigurationsDTO tokenConfigurations,
                                       [FromServices] IDistributedCache cache)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            bool credenciaisValidas = false;
            var  _IDUsuario         = string.Empty;

            AccessDataDTO _accessData = new AccessDataDTO();

            try
            {
                if (login.Grant_Type == "password")
                {
                    var _usuario = usuariosDAO.SelectUsuarioPorCredenciais(login.Email, login.Password);

                    credenciaisValidas = (_usuario != null);

                    if (credenciaisValidas)
                    {
                        if (_usuario.Ativo == false)
                        {
                            return(BadRequest("Usuário bloqueado! Entre em contato com o administrador."));
                        }

                        _IDUsuario = _usuario.IDUsuario.ToString();
                    }
                }
                else if (login.Grant_Type == "refresh_token")
                {
                    RefreshTokenDataDTO refreshTokenBase = null;
                    string strTokenArmazenado            = cache.GetString(login.RefreshToken);
                    if (!String.IsNullOrWhiteSpace(strTokenArmazenado))
                    {
                        refreshTokenBase = JsonConvert.DeserializeObject <RefreshTokenDataDTO>(strTokenArmazenado);
                    }

                    credenciaisValidas = (refreshTokenBase != null && login.RefreshToken == refreshTokenBase.RefreshToken);
                    // Elimina o token de refresh já que um novo será gerado
                    if (credenciaisValidas)
                    {
                        _IDUsuario = refreshTokenBase.IDUsuario;
                        cache.Remove(login.RefreshToken);
                    }
                }
                else
                {
                    return(BadRequest("Invalid grant_type"));
                }

                if (!credenciaisValidas)
                {
                    return(BadRequest("Usuário ou senha inválidos. Caso não se lembre, clique em esqueci minha senha!"));
                }

                _accessData = GenerateToken(_IDUsuario, signingConfigurations, tokenConfigurations, cache);

                SaveSessao(_IDUsuario, login, _accessData);
            }
            catch (Exception ex)
            {
                return(BadRequest(ex));
            }
            return(Ok(_accessData));
        }