none
Bloquear acesso simultaneo de um usuário

    Question

  • Boa tarde pessoal,

    Estou com um problema, preciso bloquear o acesso simultaneo de um mesmo usuário no sistema, mas não estou conseguindo. Não gostaria de utilizar banco de dados para isso, como gravar um campo com status "online/offline" ou "0/1". Andei pesquisando e vi que com "Application" talvez seja possível, uma vez que fica acessível a todos os usuários do sistema ao contrário da "Session".
    Até consegui bloquear o acesso, mas não consigo fazer desbloquear.

    Criei uma variável de aplicação desse modo:

    // A variável login recupera o login digitado no formulário de entrada
    
    // Inicializa ou incrementa o contador de páginas
    if (Application[login] == null)
    {
             //Bloqueia o objeto Application
             Application.Lock();
             // Incrementa o contador
             Application[login] = 1;
             // Desbloqueia o objeto Application
             Application.UnLock();
             ... 

    Caso o Application[login] não seja nulo (isso quer dizer que alguém já logou com esse login) então o sistema exibe uma mensagem. Até aí está funcionando corretamente.

    Para desbloquear eu criei uma Session["login"] que recebe o login do usuário, e no global.asax ao encerrar a sessão ou a aplicação fiz o seguinte:

    void Application_End(object sender, EventArgs e) 
    {
        if (Session["login"] != null)
        {
             Application.Remove(Session["login"].ToString());
        }
    }
            
    void Session_End(object sender, EventArgs e) 
    {
        if (Session["login"] != null)
        {
             Application.Remove(Session["login"].ToString());
        }
    }

    Mas o código do global.asax não funcionou. Alguém tem idéia de como posso fazer isso?

    Obrigado

    André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos!
    Tuesday, December 22, 2009 5:27 PM

Answers

  • Você pode usar a Applications... cria um array de ID ou nome de usuários que estão atualmente no sistema. Ai toda vez q um usuário tentar logar vc verifica se ele já não se encontra nesse Applications["usersAutenticados"]... se ele estiver é pq está atualmente no sistema. Ao fazer o log off ou a sessão expirar, vc retira o usuário do array do Applications["usersAutenticados"].
    Uma pergunta: vc está usando Membership? pq se estiver, vc pode fazer:

    MembershipUser user = Membership.GetUser("UsuarioX");
    if (user.IsOnline)
    {
        //...
    }

    Friday, December 25, 2009 5:09 PM

All replies

  • Como está sua linha sessionState no webconfig?
    Tuesday, December 22, 2009 5:31 PM
  • Olá Seilor,

    Está assim:
    <sessionState timeout="20"/>
    André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos!
    Tuesday, December 22, 2009 5:36 PM
  • coloque mais mode="InProc" no webconfig

    Outra coisa tenta validar no no session_onend, pq vc não valida o user quanto ele tenta se logar, acho que é mais fácil.
    Tuesday, December 22, 2009 5:39 PM
  • Por curiosidade para que serve o mode="InProc"?

    Como eu validaria o usuário quando ele tentasse se logar?

    Obrigado
    André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos!
    Tuesday, December 22, 2009 5:47 PM
  • Olá, da uma olahda que vc vai entender bem sobre session :)
    http://msdn.microsoft.com/en-us/library/ms972429.aspx

    Vc usa membership?ou fez uma classe para validar user?
    Tuesday, December 22, 2009 5:52 PM
  • Olá Seilor,

    Acho que sessão não é o problema no meu caso. O que eu quero é bloquear o acesso de um login a um único acesso.
    Por exemplo:
    Na máquina A eu acessei o sistema com o login "teste", se alguém tentar acessar o sistema com o login "teste" da máquina B o acesso tem que ser bloqueado. E acho que com sessão isso não vai ser resolvido.

    Criei uma classe para validar o usuário

    André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos!
    Tuesday, December 22, 2009 6:00 PM
  • Ela herda da membership ou não?se não herdar vc vai ter que fazer sua classe ter essa validação vc pode jogar na váriável de aplication tb, e salvar na sua classe.
    Tuesday, December 22, 2009 6:03 PM
  • Não vou mexer muito no sistema, pois ele já está pronto e funcionando. Estou tentando fazer isso para incrementar a segurança, mas quero fazer isso da forma mais simples para não comprometer o que já funciona.

    Obrigado pela atenção e ajuda!
    André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos!
    Tuesday, December 22, 2009 6:12 PM
  • Você pode usar a Applications... cria um array de ID ou nome de usuários que estão atualmente no sistema. Ai toda vez q um usuário tentar logar vc verifica se ele já não se encontra nesse Applications["usersAutenticados"]... se ele estiver é pq está atualmente no sistema. Ao fazer o log off ou a sessão expirar, vc retira o usuário do array do Applications["usersAutenticados"].
    Uma pergunta: vc está usando Membership? pq se estiver, vc pode fazer:

    MembershipUser user = Membership.GetUser("UsuarioX");
    if (user.IsOnline)
    {
        //...
    }

    Friday, December 25, 2009 5:09 PM
  • Andre estou com o msm problema, vc conseguiu resolver?
    Thursday, May 20, 2010 6:57 PM