Iterate através de objetos sessão existente
-
06-07-2019 - |
Pergunta
Eu quero ser capaz de matar as sessões existentes para o mesmo nome de usuário quando alguém faz login para evitar que várias pessoas de usar o mesmo login.
Existe uma maneira para percorrer as sessões existentes e matá-los?
Solução
Adicione isto a sua global.asax
protected void Application_Start(object sender, EventArgs e)
{
Application["sessions"] = new List<HttpSessionState>();
}
protected void Session_Start(object sender, EventArgs e)
{
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Add(this.Session);
}
protected void Session_End(object sender, EventArgs e)
{
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Remove(this.Session);
}
Agora você pode interagir através de suas sessões como esta ??p>
var sessions = (List<HttpSessionState>)Application["sessions"];
foreach (var session in sessions)
...
A fim de matar outras sessões em você pode verificar no método Session_Start
para a sessão antiga abandoná-la. Isso poderia ser algo como isto.
protected void Session_Start(object sender, EventArgs e)
{
var userId = (int)this.Session["userId"];
foreach (var session in sessions)
if ((int)session["userId"] == userId)
session.Abandon();
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Add(this.Session);
}
Outras dicas
Você pode salvar os usuários conectados ao banco de dados e verificar se eles já logado, você pode impedi-los de login novamente. usando o método Session_Start sob Global.asax.
Resposta curta: não.
Resposta longa: você precisa implementar seu próprio provedor de sessão. Não há nenhuma maneira para uma sessão para fazer referência a qualquer outra sessão, por razões de segurança. Você teria que ir ao redor e implementar seu próprio gerenciamento de sessão.
A única vez que eu implementei isso, eu armazenados IDs de usuário (ou algo único) em uma variável de aplicativo, um dicionário ou um array. É fácil verificar a existência do ID de usuário no dicionário do aplicativo no log no tempo. A questão única real é que as pessoas que não sair e simplesmente fechar o navegador. Você nunca vai encontrar uma boa maneira confiável para detectar este evento.
Off the cuff:
Em Session_Start (geralmente um login bem-sucedido), na loja UserID do usuário e de sessão em um tabela de pesquisa (ou nova coluna na tabela de usuário).
Em cada pedido seria necessário para validar que o UserID (armazenados na sessão) e SessionID coincidir com os valores armazenados na tabela de pesquisa como um passo de autenticação.