So überprüfen Sie, wann ein Benutzer eine ASP.NET-App verlässt

In ASP.NET suche ich nach einer Möglichkeit, einen Benutzer zu auditieren, der meine Anwendung verlässt. Um genau zu sein, möchte ich einen "Logout" Datensatz in eine Audit-Tabelle in SQL Server einfügen, wenn die Sitzung des Benutzers aus irgendeinem Grund abgebrochen/zerstört wird (nicht unbedingt wegen eines Aufrufs von session.abandon)

Ich habe eine "SessionHelper" -Klasse, die die Session-Setter/Getter verwaltet.

Ich habe versucht, in Session.End in Global.asax zu posten, aber dieses Ereignis wurde auch nach Ablauf der Zeit nicht ausgelöst.

Ich habe versucht, in der SessionHelper-Klasse "finalize" zu setzen und es dort zu machen, wenn die Klasse zerstört wird, aber dieses Ereignis wurde auch nicht ausgelöst.

Ich würde versuchen, IDisposable im SessionHelper zu implementieren, aber ich weiß nicht, wo ich es anrufen soll, damit es immer aufgerufen wird.

Was ist der richtige Weg, um einen Benutzer zu auditieren, der Ihre ASP.NET-Anwendung verlässt?

Vielen Dank!

2

3 Antworten

Das Session_End-Ereignis wird nur ausgelöst, wenn Sie über InProc-Sitzungen verfügen. Die SQL- oder Status-Server-Sitzungsverwaltung löst dieses Ereignis nicht aus. Wenn Sie können, kehren Sie zu InProc-Sitzungen zurück und verwenden Sie dieses Ereignis.

Abgesehen davon werden Sie keine sehr guten Lösungen bekommen. ASP.NET bietet keine Möglichkeit, sich die aktuelle Liste der Sessions auf dem Server anzuschauen (zumindest keine Möglichkeit, die Benutzer von StackOverflow kennen, da ich die Frage schon gestellt habe), also kann man einen Job nicht verwenden überprüfe, wann sie zerstört sind.

Die nächstbeste Lösung wäre, eine "letzte Zugriffszeit" irgendwo für Ihre Benutzer zu speichern und damit ein Timeout der Sitzung zu erkennen. Die Implementierung eines solchen Jobs ist jedoch kompliziert (Sie können Logout-Ereignisse verpassen, wenn sich ein Benutzer beispielsweise schnell an- und abmeldet) ...

Also keine perfekte Lösung hier.

2
hinzugefügt

Beachten Sie den "richtigen Weg", aber ich habe es in der Vergangenheit so gemacht.

Haben Sie einen "Ist aktiv" -Datum-Zeitstempel, der dem Benutzerdatensatz in der Datenbank zugeordnet ist. Jedes Mal, wenn der Benutzer auf eine Seite zugreift, die auf die aktuelle Zeit aktualisiert wird. Wenn jemand nicht innerhalb von 15 Minuten auf die Seite zugegriffen hat, wird dieser Benutzer als "Logout" -Ereignis aufgezeichnet und der Zeitstempel wird auf NULL gesetzt.

2
hinzugefügt
Ich mache etwas ähnliches, ich benutze die sql-basierte Session-Behandlung und habe eine letzte Spalte in der Tabelle, die meine Sitzungsdaten enthält. Es gibt eine gespeicherte Prozedur, die jedes Mal ausgeführt wird, wenn ein Sitzungsdatensatz geändert wird, der die Tabellen aller nicht verwendeten Sitzungszeilen bereinigt, die länger als ein vordefinierter TIMEOUT-Wert inaktiv sind.
hinzugefügt der Autor stephenbayer, Quelle

Im besten Fall wird Ihr Logout-Datensatz eine intelligente Vermutung sein, auch wenn Sie die Sitzungsereignisse richtig funktionieren lassen, wenn der Benutzer Ihre Website/App verlassen hat. Eine Technik, die Sie möglicherweise verwenden, ist, die Abmeldezeit in die db zu legen, wenn sich der Benutzer anmeldet, und einfach den Datensatz mit einer zukünftigen Zeit zu aktualisieren, während sie das System benutzen. Hier ist das allgemeine Schema einer Sitzungstabelle, die ich kürzlich verwendet habe:

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

In dieser Tabelle aktualisiere ich einfach die ExpiresOn-Spalte, während der Benutzer mit der Anwendung interagiert (aktuelle Zeit + 20 Minuten). Wenn sie versuchen, nach dem ExpiresOn zu interagieren, weiß ich, dass sie 20 Minuten lang inaktiv waren und eine neue Anmeldung erzwingen. Zur Berichterstellung weiß ich, dass der Benutzer abgemeldet ist, wenn die aktuelle Zeit größer ist als ExpiresOn. Sie können komplexer als das werden. Zum Beispiel verschiebe ich meine Daten aus der oben aufgeführten Sitzungstabelle in eine Berichtstabelle mit einem regulären Prozess. Dies dient nur dazu, die Sitzungstabelle klein zu halten, da viele Dinge damit interagieren.

1
hinzugefügt