none
problemas ao fazer logout com session e cookie RRS feed

  • Pergunta

  • galera é o seguinte quando vou clicar em logout em minha app web tem o seguinte codigo

    Ex:

    session.clear();

    forms.logout;

    coockie = expires

    Não lembro de cabeça o código mas é + ou - isso.

    O problema é se eu tenho duas abas abertas no sistema mas com usuarios diferentes quando faço logout com um e o outro atualizar a página dele faz logout tmb, como faço para resolver isso.

    quinta-feira, 9 de fevereiro de 2012 17:17

Respostas

  • "[...]Isso porque quando você abre mais de uma tab, elas compartilham a mesma session.[...]"

    Boas Fabricio,

    Isso que vocês escreveu está errado.

    O que é partilhado entre os tabs do mesmo browser são as Cookies.

    Porém ... se não tiver configurado o SessionState como Cookieless a chave de sessão será preservada entre posts num cookie o que provoca, quando os cookies são invalidados, o comportamento descrito pelo Thiago.

    Para evitar este problema bastará seguir as seguintes indicações:

    • configurar, web.config, o SessionState como cookieless:
    <sessionState cookieless="UseUri" />
    • garantir que os links gerados pela aplicação passam todos pelo método:
    HttpContext.Current.Response.ApplyAppPathModifier(caminho)

    Estes dois passos garantem que a chave de sessão ASP.NET fica preservada no URL:

    http://yourserver/folder/(session ID here)/default.aspx
    Aqui fica um link util sobre este tema.

    Nota Final:

    @Thiago, se existirem cookies registados por dominio (i.e., usados em todos os tabs com páginas da mesma aplicação) e que sejam necessários para a autenticação do pedido, então apagar todos os cookies resultará igualmente num erro sempre que um tab seja submetido para o servidor.


    Nuno Gomes http://nunogomes.net

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    terça-feira, 14 de fevereiro de 2012 01:04
  • Thiago,

    Já tentou Session.Abandon()  ? Você usar MasterPage ou alguma classe base? Pergunto isto porque se não resolver você pode verificar se a session não é nulla e com isto forçar alguma ação.


    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    segunda-feira, 13 de fevereiro de 2012 14:09
  • Isso irá ocorrer mesmo, o jeito para solucionar isso seria evitar que o usuario abra sua aplicação em mais de uma aba (talvez executar em popUp)... Isso porque quando você abre mais de uma tab, elas compartilham a mesma session.

    Quando tive esse problema, segui esse exemplo:

    http://www.codeproject.com/Articles/35859/Detect-and-prevent-multiple-windows-or-tab-usage-i

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    segunda-feira, 13 de fevereiro de 2012 15:28
  • Bom dia Thiago segue em exemplo ai.

    Caso ainda tenha duvida pergunta ai.

    if (((string)Session["usuario"]) == null)
                {

    /*aqui vc se o usuario for nulo. por exemplo alguem digitou na URL sua pagina de cadastro ele ira verificar e se não ouver login ele    manda para a pagina principal*/

                    Response.Redirect("Login.aspx", false);
                }
                else
                {

    /*seus metodos.*/

    }

    para a session vc ultiliza Session.Abandon(); aqui ele ira abandonar a sessão caso o usuario queira sair do sistema.


    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    quarta-feira, 15 de fevereiro de 2012 14:12
  • Aqui um exemplo com o cookie 

     if (cookie == null)

                    {


                        myCookie.Value = txtRE.Text;
                        myCookie.Expires = DateTime.Now.AddDays(30d); /*aqui eu estou pedidno para inspirar o cookie de 30 dias*/
                        Response.Cookies.Add(myCookie);


                        myCookieSenha.Value = txtSenha.Text;
                        myCookieSenha.Expires = DateTime.Now.AddDays(30d); /*aqui eu estou pedidno para inspirar o cookie de 30 dias*/
                        Response.Cookies.Add(myCookieSenha);
                    }

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    quarta-feira, 15 de fevereiro de 2012 14:14

Todas as Respostas

  • Thiago,

    Já tentou Session.Abandon()  ? Você usar MasterPage ou alguma classe base? Pergunto isto porque se não resolver você pode verificar se a session não é nulla e com isto forçar alguma ação.


    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    segunda-feira, 13 de fevereiro de 2012 14:09
  • Isso irá ocorrer mesmo, o jeito para solucionar isso seria evitar que o usuario abra sua aplicação em mais de uma aba (talvez executar em popUp)... Isso porque quando você abre mais de uma tab, elas compartilham a mesma session.

    Quando tive esse problema, segui esse exemplo:

    http://www.codeproject.com/Articles/35859/Detect-and-prevent-multiple-windows-or-tab-usage-i

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    segunda-feira, 13 de fevereiro de 2012 15:28
  • "[...]Isso porque quando você abre mais de uma tab, elas compartilham a mesma session.[...]"

    Boas Fabricio,

    Isso que vocês escreveu está errado.

    O que é partilhado entre os tabs do mesmo browser são as Cookies.

    Porém ... se não tiver configurado o SessionState como Cookieless a chave de sessão será preservada entre posts num cookie o que provoca, quando os cookies são invalidados, o comportamento descrito pelo Thiago.

    Para evitar este problema bastará seguir as seguintes indicações:

    • configurar, web.config, o SessionState como cookieless:
    <sessionState cookieless="UseUri" />
    • garantir que os links gerados pela aplicação passam todos pelo método:
    HttpContext.Current.Response.ApplyAppPathModifier(caminho)

    Estes dois passos garantem que a chave de sessão ASP.NET fica preservada no URL:

    http://yourserver/folder/(session ID here)/default.aspx
    Aqui fica um link util sobre este tema.

    Nota Final:

    @Thiago, se existirem cookies registados por dominio (i.e., usados em todos os tabs com páginas da mesma aplicação) e que sejam necessários para a autenticação do pedido, então apagar todos os cookies resultará igualmente num erro sempre que um tab seja submetido para o servidor.


    Nuno Gomes http://nunogomes.net

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    terça-feira, 14 de fevereiro de 2012 01:04
  • Bom dia Thiago segue em exemplo ai.

    Caso ainda tenha duvida pergunta ai.

    if (((string)Session["usuario"]) == null)
                {

    /*aqui vc se o usuario for nulo. por exemplo alguem digitou na URL sua pagina de cadastro ele ira verificar e se não ouver login ele    manda para a pagina principal*/

                    Response.Redirect("Login.aspx", false);
                }
                else
                {

    /*seus metodos.*/

    }

    para a session vc ultiliza Session.Abandon(); aqui ele ira abandonar a sessão caso o usuario queira sair do sistema.


    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    quarta-feira, 15 de fevereiro de 2012 14:12
  • Aqui um exemplo com o cookie 

     if (cookie == null)

                    {


                        myCookie.Value = txtRE.Text;
                        myCookie.Expires = DateTime.Now.AddDays(30d); /*aqui eu estou pedidno para inspirar o cookie de 30 dias*/
                        Response.Cookies.Add(myCookie);


                        myCookieSenha.Value = txtSenha.Text;
                        myCookieSenha.Expires = DateTime.Now.AddDays(30d); /*aqui eu estou pedidno para inspirar o cookie de 30 dias*/
                        Response.Cookies.Add(myCookieSenha);
                    }

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:08
    quarta-feira, 15 de fevereiro de 2012 14:14