public Token Autenticar(string usuario, string senha, ConfiguracoesToken configsToken, AssinaturaToken assinatura)
        {
            var usuarioBanco = ValidarUsuario(usuario, senha);

            if (usuarioBanco == null)
            {
                throw new RegraNegocioException(MensagensErro.UsuarioNaoLocalizado);
            }

            var dominio = new UsuarioDm(
                usuarioBanco.Id,
                usuarioBanco.Usuario,
                string.Empty,
                usuarioBanco.DataCriacao,
                usuarioBanco.Ativo,
                usuarioBanco.DataCadastroSenha,
                usuarioBanco.DiasRenovacao,
                null,
                null
                );

            if (dominio.PossuiSenhaExpirada())
            {
                throw new RegraNegocioException(MensagensErro.UsuarioSenhaExpirada);
            }

            if (!dominio.Ativo)
            {
                throw new RegraNegocioException(MensagensErro.UsuarioBloqueado);
            }

            ClaimsIdentity identity = new ClaimsIdentity(
                new[] {
                new Claim("Usuario", usuarioBanco.Id.ToString()),
                new Claim("Pessoa", usuarioBanco.Pessoa.Id.ToString()),
                new Claim("Grupo", usuarioBanco.Grupo.Id.ToString()),
            }
                );

            DateTime dataCriacao   = DateTime.Now;
            DateTime dataExpiracao = dataCriacao + TimeSpan.FromMinutes(configsToken.DuracaoMinutos);

            var handler    = new JwtSecurityTokenHandler();
            var dadosToken = handler.CreateToken(new SecurityTokenDescriptor
            {
                Issuer             = configsToken.Originador,
                SigningCredentials = assinatura.credenciais,
                Subject            = identity,
                NotBefore          = dataCriacao,
                Expires            = dataExpiracao
            });
            var token = handler.WriteToken(dadosToken);

            return(new Token(token, dataCriacao, dataExpiracao));
        }
        public bool IncluirUsuario(UsuarioInclusaoDto usuario)
        {
            if (usuario.Senha != usuario.ConfirmacaoSenha)
            {
                throw new ArgumentException(MensagensErro.UsuarioFalhaConfirmacaoSenha);
            }

            DateTime dataAtual = DateTime.Now;

            GrupoDto grupo = _grupoServico.PesquisarGrupoPorId(usuario.IdGrupo);

            if (grupo == null)
            {
                throw new ArgumentException(MensagensErro.UsuarioGrupoNaoEncontrado);
            }

            var grupoDominio = new GrupoDm(grupo.Id, grupo.Nome, grupo.Descricao, grupo.Pai);

            grupoDominio.DefinirMensagens(_mensagens);

            var pessoa = _pessoaServico.PesquisarPessoaPorId(usuario.IdPessoa);

            if (pessoa == null)
            {
                throw new ArgumentException(MensagensErro.UsuarioPessoaNaoEncontrada);
            }

            var pessoaDominio = new PessoaDm(pessoa.Id, pessoa.Nome, pessoa.Cpf, pessoa.Email, pessoa.Telefone);

            pessoaDominio.DefinirMensagens(_mensagens);

            var dominio = new UsuarioDm(
                0,
                usuario.Usuario,
                usuario.Senha,
                dataAtual,
                true,
                dataAtual,
                usuario.DiasRenovacao,
                grupoDominio,
                pessoaDominio
                );

            dominio.ValidarDados();

            if (_mensagens.PossuiFalhasValidacao())
            {
                throw new RegraNegocioException(MensagensErro.RegraNegocioErroValidacao);
            }

            var usuarioBanco = new UsuarioDpo(
                dominio.Id,
                dominio.Usuario,
                dominio.Senha.ValorCriptografado,
                dataAtual,
                dataAtual,
                dominio.DiasRenovacao,
                dominio.Ativo,
                dominio.Grupo.Id,
                dominio.Pessoa.Id
                );

            var sucessoInsercao = _UsuarioRepositorio.InserirUsuario(usuarioBanco);

            if (!sucessoInsercao)
            {
                _mensagens.AdicionarMensagem(TipoMensagem.Erro, MensagensErro.UsuarioFalhaInclusao);
            }

            _mensagens.AdicionarMensagem(MensagensErro.UsuarioSucessoInclusao);
            return(sucessoInsercao);
        }