Exemplo n.º 1
0
        internal bool Autenticar(string login, String senhaHash, int timeout, out String userSessionId, BancoDeDados banco)
        {
            bool usuarioValido = false;

            userSessionId = string.Empty;
            Usuario usuarioAuditoria = new Usuario();

            usuarioAuditoria.Login = login;            //Necessario para auditoria

            try
            {
                using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(banco))
                {
                    bancoDeDados.IniciarTransacao();
                    usuarioAuditoria.Ip = HttpContext.Current.Request.UserHostAddress;

                    #region Busca Usuario/Credenciado e verifica validade

                    Usuario usuario = _busUsuario.Obter(login, bancoDeDados);

                    //Deve retornar APENAS se usuario não existir
                    if (usuario == null)
                    {
                        Validacao.Add(Mensagem.Login.LoginSenhaInvalido);
                        return(false);
                    }

                    usuarioValido        = String.Equals(usuario.senhaHash, senhaHash);
                    usuarioAuditoria.Id  = usuario.Id;
                    usuarioAuditoria.TID = usuario.TID;

                    //Buscar Credenciado e grava num de tentativas
                    CredenciadoPessoa credenciado = _da.ObterCredenciadoLogin(usuario.Id, timeout);

                    //Deve retornar APENAS se Credenciado não existir
                    if (credenciado == null)
                    {
                        Validacao.Add(Mensagem.Login.LoginSenhaInvalido);
                        return(false);
                    }

                    credenciado.Usuario = usuario;

                    #endregion

                    #region Execução Obrigatoria [Independe de status do credenciado]

                    string strSessionForcarLogoff = string.Empty;

                    //Não se pode char busUsuario Autenticar antes do metodo no finally!!!
                    if (usuarioValido && credenciado.Logado)
                    {
                        GerenciarAutenticacao.Deslogar(login, true);

                        if (usuarioValido && credenciado.ForcarLogout)
                        {
                            strSessionForcarLogoff = credenciado.SessionId;

                            if (!String.Equals(credenciado.Usuario.Ip, usuarioAuditoria.Ip))
                            {
                                Validacao.Add(Mensagem.Login.SessaoDerrubada);
                            }
                        }
                    }

                    #endregion

                    #region Bloqueio e mensagem de bloqueado

                    if (credenciado.Tentativa > _config.Obter <Int32>(ConfiguracaoCredenciado.KeyNumTentativas))
                    {
                        credenciado.Situacao = (int)eCredenciadoSituacao.Bloqueado;
                        credenciado.Usuario  = new Usuario()
                        {
                            Login = login
                        };
                        _da.AlterarSituacao(credenciado, bancoDeDados);
                        Validacao.Add(Mensagem.Login.FuncionarioBloqueado);
                        return(false);
                    }

                    if (credenciado.Situacao == (int)eCredenciadoSituacao.Bloqueado)
                    {
                        Validacao.Add(Mensagem.Login.SituacaoInvalida(CredenciadoSituacoes.Single(x => x.Id == credenciado.Situacao).Nome));
                        return(false);
                    }

                    #endregion

                    #region Aguardando Chave

                    if (credenciado.Situacao == (int)eCredenciadoSituacao.AguardandoAtivacao || credenciado.Situacao == (int)eCredenciadoSituacao.AguardandoChave)
                    {
                        Validacao.Add(Mensagem.Login.AguardandoChave);
                        return(false);
                    }

                    #endregion

                    //Fazer aqui
                    //Acesso não permitido nestes horários e/ou dia! Entre em contato com o administrador do sistema

                    #region Valida senha vencida

                    // 4 -Senha Vencida
                    if (_da.VerificarSenhaVencida(usuario.Id))
                    {
                        //Mensagem gerada na interface
                        return(false);
                    }

                    #endregion

                    #region Mensagem Número de tentativas

                    if (!usuarioValido && credenciado.Situacao != (int)eCredenciadoSituacao.Bloqueado)
                    {
                        Validacao.Add(Mensagem.Login.NumTentativas(credenciado.Tentativa, _config.Obter <Int32>(ConfiguracaoCredenciado.KeyNumTentativas)));
                    }

                    #endregion

                    //Efetiva a autenticação de credenciado [Atenção para o finally]
                    if (usuarioValido)
                    {
                        credenciado.SessionId = Guid.NewGuid().ToString();
                        userSessionId         = credenciado.SessionId;                 //Parâmetro out deste metodo!!!
                        _da.Autenticar(credenciado, strSessionForcarLogoff, bancoDeDados);
                    }

                    bancoDeDados.Commit();
                }
            }
            catch
            {
                usuarioValido = false;
                throw;
            }
            finally
            {
                //Autentica Usuario, gera historico e linha de auditoria
                using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(banco))
                {
                    bancoDeDados.IniciarTransacao();

                    _busUsuario.Autenticar(usuarioAuditoria, usuarioValido, (int)eExecutorTipo.Credenciado, bancoDeDados);

                    bancoDeDados.Commit();
                }
            }

            return(usuarioValido);
        }