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?

Foi útil?

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

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.

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