Como faço para definir explicitamente sessões ASP.NET para expirar apenas em fechar o navegador ou logou explícito?

StackOverflow https://stackoverflow.com/questions/93888

  •  01-07-2019
  •  | 
  •  

Pergunta

Por padrão o termo sessão parece ser de 20 minutos.

Update: eu não quero a sessão para expirar até que o navegador for fechado

.

Update2: Este é o meu cenário. Usuário fizer em site. Desempenha em todo o site. Folhas de computador para ir para um chuveiro (> 20 minutos;)). Volta para o computador e deve ser capaz de brincar. Ele fecha o navegador, o que elimina o cookie de sessão. A próxima vez que ele vem para o site a partir de uma nova instância do navegador, ele precisa fazer o login novamente.

No PHP eu posso definir session.cookie_lifetime no php.ini a zero para o conseguir.

Foi útil?

Solução

Se você quiser estender a sessão para além de 20 minutos, você mudar o padrão usando a administração do IIS ou você pode configurá-lo no arquivo web.config. Por exemplo, para ajustar o tempo de espera de 60 minutos no web.config:

<configuration>
  <system.web>
    <sessionState timeout="60" />
    ... other elements omitted ...
  </system.web>
  ... other elements omitted ....
</configuration>

Você pode fazer o mesmo para um usuário específico no código com:

Session.Timeout = 60

Independentemente do método escolhido, você pode alterar o tempo limite para o valor que você acha que é razoável permitir que seus usuários para fazer outras coisas e ainda manter a sua sessão.

Existem desvantagens do curso: para o usuário, há a questão de deixar o seu navegador sem vigilância e tê-lo ainda conectado quando alguém começa a outra pessoa a usá-lo de segurança possível. Para você, há a questão do uso de memória no servidor - as sessões mais longas últimos, mais memória que você vai usar em qualquer momento um. Quer ou não o que importa depende da carga no seu servidor.

Se você não quer guesstimate um tempo limite estendido razoável, você vai precisar usar uma das outras técnicas já sugeridas, exigindo algum JavaScript em execução no navegador para executar ping o servidor periodicamente e / ou abandonar a sessão quando um página é descarregada (desde que o usuário não vai para outra página no seu site, é claro).

Outras dicas

Você pode definir um tempo limite sessão curta (por exemplo, 5 minutos) e, em seguida, obter a página para consultar o servidor periodicamente, usando Javascript para disparar um XMLHttpRequest a cada 2 minutos, ou por ter um iframe escondido que aponta para uma página que -se a cada 2 minutos refresca.

Uma vez que o fechamento do navegador, a sessão teria tempo limite muito rapidamente depois como não haveria nada para mantê-lo vivo.

Isto não é um problema novo, há vários cenários que devem ser manuseados se você quer pegar todas as maneiras uma sessão pode terminar, aqui são exemplos gerais de alguns deles:

  1. A instância do navegador ou guia está fechada.
  2. navega Usuários de distância de seu site usando a mesma instância do navegador ou guia.
  3. Os usuários perde sua conexão com a internet (isto pode incluir perda de energia para o computador do usuário ou qualquer outro meio).
  4. Usuário anda longe do computador (ou em alguma outra maneira deixa de interagir com o seu site).
  5. O servidor perde potência / reboots.

Os dois primeiros itens devem ser tratadas pelo cliente enviar informações para o servidor, geralmente você usaria o JavaScript para navegar a uma página de logout que rapidamente expira a sessão.

O terceiro e quarto itens são normalmente tratados, definindo o tempo limite estado da sessão (que pode ser qualquer quantidade de tempo). A quantidade de tempo que você usa é baseado em encontrar um valor que permite que os usuários usem o seu site sem sobrecarregar o servidor. Uma regra muito áspera de ouro poderia ser 30 minutos mais ou menos 10 minutos. No entanto, o valor apropriado provavelmente teria de ser objecto de um outro post.

O quinto item é tratado com base em como você está armazenando suas sessões. Sessões armazenadas no estado não vai sobreviver a uma reinicialização, uma vez que estão em memória RAM do computador. Sessões armazenados em um db ou um cookie iria sobreviver a reinicialização. Você poderia lidar com isso, como você vê o ajuste.

Em minha experiência limitada quando este problema surgiu antes, ele foi determinado que apenas definir o tempo limite da sessão para um valor aceitável é tudo que é necessário. No entanto isso pode ser feito.

Este é o padrão. Quando você tem uma sessão, ele armazena a sessão em um "cookie de sessão", que é automaticamente excluído quando o navegador é fechado.

Se você quer ter a sessão entre a sessão 2 navegador, você tem que definir o Cookie.Expired para uma data no recurso.

Porque a sessão que falar sobre é armazenado pelo servidor, e não o cliente que você não pode fazer o que quiser.

Mas considere não usar sessão do lado do servidor ASP.NET, e em vez disso só dependem de cookies.

Infelizmente, devido à natureza explícita da web eo fato não há nenhuma ligação permanente entre um servidor de website e um navegador usuários é impossível dizer quando um usuário fechou seu browser. Existem eventos e JavaScript que você pode implementar (por exemplo onunload) que você pode usar para fazer chamadas de volta ao servidor, que por sua vez poderia 'matar' uma sessão - Session.Abandon();

Você pode definir o período de tempo limite de uma sessão dentro do web.config, lembre-se este tempo limite é baseado no tempo desde a última chamada para o servidor foi colocado pelo navegador usuários.

não acrescentou TimedOut navegador.

Não há nenhuma maneira de limpar explicitamente a sessão se você não se comunicar de alguma forma entre o cliente eo servidor no ponto de fechamento da janela, então eu esperaria o envio de um pedido especial URI para limpar a sessão no ponto de receber uma mensagem de fechar janela.

Meu Javascript não é bom o suficiente para dar-lhe as instruções reais para fazer isso; desculpe: (

Você não pode, como você não pode controlar como a resposta do cliente html.

Na verdade, por que você precisa para fazê-lo? Enquanto ninguém pode pegar a sessão para usar novamente, ele iria expirar depois que 20 minutos. Se os recursos não importa, definir uma expiração sessão mais agressiva (a maioria das empresas de hospedagem fez isso, o que é terrivelmente chato) ou usar menos objetos na sessão. Tente evitar qualquer tipo de objeto, ao invés de apenas armazenar as chaves para recuperá-los, que é um projeto muito importante, pois ajuda você a dimensionar a sessão para um servidor de estado quando você ficar grande.

me corrija se eu estou interpretando mal a intenção da sua pergunta, mas a questão subjacente parece ser menos sobre como forçar a sessão para terminar quando um usuário fecha o navegador e mais sobre como prevenir uma sessão de acabar até que o navegador está fechada.

Eu acho que a verdadeira resposta para isso é reavaliar o que você está usando sessões para fazer. Se você estiver usando-os para manter o estado, eu concordo com as outras respostas que você pode estar fora de sorte.

No entanto, a abordagem preferida é a utilização de um mecanismo de estado persistente com o mesmo âmbito que a sessão do navegador, como um cookie que expira quando o navegador é fechado. Esse cookie pode conter informações suficientes para re-iniciar a sessão no servidor se ele expirou desde o último pedido. Combinado com um tempo limite de sessão relativamente curta (5-10 min), penso que este lhe dá o melhor equilíbrio entre o uso de recursos do servidor e não fazer o usuário continuamente "re-boot" do site.

Oh você ter reescrito a questão.

Aquele é absolutamente viável, desde que javascript está vivo. Use qualquer ajax cronometrado vai fazer. Verifique com a biblioteca de protótipo http://www.prototypejs.org PeriodicalExecutor ou jQuery com o ajax + temporizador plugin. Setup uma página dummy que o seu executor vai chamar ao longo do tempo, assim que sua sessão está sempre viva a menos que se ele logouts (matar o temporizador ajax no mesmo tempo) ou fechar o navegador (o que significa o executor é morto de qualquer maneira)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top