Cum să efectuați un audit când un utilizator părăsesc o aplicație ASP.NET

În ASP.NET, caut un mod de a audita un utilizator care lasă aplicația mea. Pentru a fi specific, aș dori să introduc o înregistrare "logout" într-un tabel de audit în SQL Server când sesiunea utilizatorului este abandonată/distrusă din orice motiv (nu neapărat din cauza unui apel la session.abandon)

Am o clasă "SessionHelper" care gestionează setterii de sesiune/getters.

Am incercat postarea in Session_End in Global.asax, dar niciodata nu a tras evenimentul dupa expirarea timpului.

Am încercat să "finalizez" în clasa SessionHelper și să o fac acolo când clasa este distrusă, dar nu a declanșat acel eveniment.

Aș încerca să implementez ID-ul disponibil în SessionHelper, dar nu știu unde să îl numesc așa încât să fie întotdeauna chemat.

Care este calea potrivită pentru a audita un utilizator care pleacă din aplicația dvs. ASP.NET?

Mulțumesc!

2

3 răspunsuri

Evenimentul Session_End este declanșat numai dacă aveți sesiuni InProc. Gestionarea sesiunilor de server SQL sau de stat nu va declanșa acest eveniment. Dacă puteți, reveniți la sesiunile InProc și utilizați acest eveniment.

În afară de asta, nu veți obține soluții foarte bune. ASP.NET nu oferă o modalitate de a analiza lista curentă de sesiuni de pe server (cel puțin, în niciun mod pe care utilizatorii de la StackOverflow nu știu, de când am pus deja întrebarea), astfel încât să nu puteți utiliza o lucrare verificați când acestea sunt distruse.

Următorul cel mai bun lucru ar fi să aveți un "ultim timp de acces" stocat undeva pentru utilizatorii dvs. și să îl utilizați pentru a detecta o expirare a sesiunii. Implementarea unui astfel de loc de muncă este complicată deși (puteți să pierdeți evenimentele de logout dacă un utilizator se loghează rapid/rapid, de exemplu) ...

Deci, nu există o soluție perfectă aici.

2
adăugat

Rețineți că sunteți sigur despre "modul corect", dar iată cum am făcut-o în trecut.

Au o ștampilă de tip "data este activă" asociată cu înregistrarea utilizatorului din baza de date. De fiecare dată când utilizatorul accesează o pagină, care este actualizată la ora curentă. Dacă cineva nu a accesat pagina cu 15 minute, atunci acel utilizator este înregistrat ca eveniment "logout", iar marca de timp este setată la NULL.

2
adăugat
Fac ceva asemănător, folosesc manipularea sesiunilor bazate pe sql și am o coloană de accesată ultima dată în tabel, care ține datele mele despre sesiuni. Există un proc stocat care rulează de fiecare dată când se modifică o înregistrare de sesiune care curăță tabelele oricărei rânduri de sesiuni neutilizate mai lungă decât o valoare predefinită TIMEOUT.
adăugat autor stephenbayer, sursa

În cel mai bun caz, înregistrarea dvs. de logout va fi o estimare inteligentă, chiar dacă veți face ca evenimentele din sesiune să funcționeze corect, de când utilizatorul a părăsit site-ul dvs./aplicația. O tehnică pe care s-ar putea să o utilizați este să plasați timpul de logout în db atunci când utilizatorul se loghează și doar să actualizați înregistrarea într-un timp viitor în timpul utilizării sistemului. Iată schema generală a unui tabel de sesiuni pe care l-am folosit recent:

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

În acest tabel, am continuat să actualizez coloana ExpiresOn pe măsură ce utilizatorul interacționează cu aplicația (ora curentă + 20 de minute). Dacă încearcă să interacționeze după ExpiresOn, atunci știu că au fost inactivi timp de 20 de minute și au forțat o nouă autentificare. În scopuri de raportare, știu că utilizatorul sa deconectat dacă timpul curent este mai mare decât ExpiresOn. Puteți deveni mai complexă decât asta. De exemplu, mișc datele mele din tabelul de sesiuni enumerate mai sus într-un tabel de raportare cu un proces obișnuit. Acest lucru este doar pentru a păstra tabelul sesiunilor mici, deoarece o mulțime de lucruri interacționează cu ea.

1
adăugat