internal bool Autenticar(string login, String senhaHash, int timeout, out String userSessionId) { bool usuarioValido = false; userSessionId = string.Empty; Usuario usuarioAuditoria = new Usuario(); usuarioAuditoria.Login = login; //Necessario para auditoria try { usuarioAuditoria.Ip = HttpContext.Current.Request.UserHostAddress; #region Busca Usuario/Credenciado e verifica validade Usuario usuario = _busUsuario.Obter(login); //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 funcionario e grava num de tentativas Funcionario funcionario = _da.ObterFuncionarioLogin(usuario.Id, timeout); //Deve retornar APENAS se funcionario não existir if (funcionario == null) { Validacao.Add(Mensagem.Login.LoginSenhaInvalido); return(false); } funcionario.Usuario = usuario; #endregion #region Execução Obrigatoria [Independe de status do funcionario] string strSessionForcarLogoff = string.Empty; //Não se pode char busUsuario Autenticar antes do metodo no finally!!! if (usuarioValido && funcionario.Logado) { GerenciarAutenticacao.Deslogar(login, true); if (usuarioValido && funcionario.ForcarLogout) { strSessionForcarLogoff = funcionario.SessionId; if (!String.Equals(funcionario.Usuario.Ip, usuarioAuditoria.Ip)) { Validacao.Add(Mensagem.Login.SessaoDerrubada); } } } #endregion #region 2 - Bloqueio if (funcionario.Tentativa > _config.Obter <Int32>(ConfiguracaoCredenciado.KeyNumTentativas)) { funcionario.Situacao = 2; // 2 - Bloqueado funcionario.Usuario = new Usuario() { Login = login }; _da.AlterarSituacao(funcionario.Id, funcionario.Situacao, null, funcionario); Validacao.Add(Mensagem.Login.FuncionarioBloqueado); return(false); } if (funcionario.Situacao == 2) // 2-Ausente { Validacao.Add(Mensagem.Login.SituacaoInvalida(Situacoes.Single(x => x.Id == funcionario.Situacao).Nome)); return(false); } #endregion //Fazer aqui //Acesso não permitido nestes horários e/ou dia! Entre em contato com o administrador do sistema #region 6 - Senha Vencida // 6 -Senha Vencida if (_da.VerificarSenhaVencida(usuario.Id, funcionario)) { //Mensagem gerada na interface return(false); } #endregion #region 4 - Ausente if (funcionario.Situacao == 4) // 4-Ausente { Validacao.Add(Mensagem.Login.SituacaoInvalida(Situacoes.Single(x => x.Id == funcionario.Situacao).Nome)); return(false); } #endregion #region Mensagem Número de tentativas if (!usuarioValido && funcionario.Situacao != 2) //2 - Bloqueado { Validacao.Add(Mensagem.Login.NumTentativas(funcionario.Tentativa, _config.Obter <Int32>(ConfiguracaoCredenciado.KeyNumTentativas))); } #endregion //Efetiva a autenticação de credenciado [Atenção para o finally] if (usuarioValido) { funcionario.SessionId = Guid.NewGuid().ToString(); userSessionId = funcionario.SessionId; //Parâmetro out deste metodo!!! _da.Autenticar(funcionario, strSessionForcarLogoff); } } catch { usuarioValido = false; throw; } finally { //Autentica Usuario, gera historico e linha de auditoria _busUsuario.Autenticar(usuarioAuditoria, usuarioValido, (int)eExecutorTipo.Interno); } return(usuarioValido); }
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); }