Pergunta

Em ASP.NET, eu estou procurando uma maneira de auditar um usuário deixar a minha aplicação. Para ser mais específico, eu gostaria de inserir um registro 'Sair' em uma tabela de auditoria no SQL Server quando a sessão do usuário é abandonado / destruído por qualquer motivo (não necessariamente por causa de uma chamada para Session.Abandon)

Eu tenho uma classe 'SessionHelper' que gere os formadores de sessão / getters.

Eu tentei postagem de volta em Session_End em Global.asax, mas nunca disparou este evento mesmo após o tempo limite expirou.

Eu tentei substituir 'finalize' na classe SessionHelper e fazê-lo lá quando a classe é destruída, mas não disparou esse evento também.

Eu tentaria implementar IDisposable na SessionHelper, mas eu não sei de onde para chamá-lo para que ele sempre é chamado.

O que é a maneira correta de auditar um usuário sair da sua aplicação ASP.NET?

Obrigado!

Foi útil?

Solução

O evento Session_End só é disparado se você tem sessões InProc. SQL ou gerenciamento de sessão servidor de estado não irá disparar este evento. Se você puder, voltar para sessões InProc e usar esse evento.

Além disso, você não vai ficar muito boas soluções. O ASP.NET não oferecem uma maneira de olhar para a lista atual de sessões no servidor (pelo menos, não há maneira que os usuários de StackOverflow saiba, uma vez que já fez a pergunta), então você não pode usar uma tarefa para verificar quando eles são destruídos.

A próxima melhor coisa seria ter uma "hora do último acesso" em algum lugar guardado para seus usuários e usar isso para detectar um tempo limite da sessão. A implementação do trabalho de um tal é complicado embora (você pode perder o logout eventos se um usuário efetua login / out rápido, por exemplo) ...

solução Portanto, não perfeito aqui.

Outras dicas

Nota certeza sobre a "maneira correta", mas aqui está como eu fiz isso no passado.

Tenha um "está ativo" data-Time selo associado ao registro de usuário no banco de dados. Toda vez que o usuário acessa uma página, que é atualizado para a hora atual. Se alguém não tenha acessado a página em digamos 15 minutos, depois que o usuário é registrado como um evento de "logout", e a hora é definido como NULL.

Na melhor das hipóteses o seu registro de logout vai ser uma suposição inteligente, mesmo se você obter os eventos de sessão para funcionar corretamente, de quando o usuário saia do site / app. Uma técnica que você pode usar é colocar o tempo de saída para o db quando o usuário fizer login, e apenas manter a atualização do registro com um tempo futuro, como eles usam o sistema. Aqui está o esquema geral de uma tabela de sessão eu usei recentemente o autor:

[Id]  [Uid]    [LoginInOn]        [ExpiresOn]  
 1    johndoe  10/14/2008 10:47   10/14/2008 11:07  

Nesta tabela Eu apenas manter a atualização da coluna ExpiresOn como o usuário interage com o aplicativo (hora atual + 20 minutos). Se eles tentam interagir após a ExpiresOn, então eu sei que ficou inativo por 20 minutos e forçar um novo login. Para fins de relatório, eu sei que o usuário tenha desconectado se a hora atual é maior do que ExpiresOn. Você pode obter mais complexa do que isso. Por exemplo, eu mover meus dados para fora da mesa de sessões listadas acima uma tabela de relatórios com um processo regular. Este é apenas para manter a pequena mesa de sessões, uma vez que muitos interage coisas com ele.

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