Die in ASP.NET integrierten SQL-Membership- und Profile-Provider sind schon eine feine Sache. Sie bieten vom Start weg eine Menge Funktionalitäten,
die dem Entwickler das Leben erleichtern. Vor allem der Profile-Provider ist sehr effektiv: man deklariert in der web.config ein neues
Feld und kann es direkt verwenden, um die Stammdaten eines Benutzers um eigene Felder zu erweitern.
Der Membership-Provider bietet, neben der Verwaltung der Benutzer, einige Zusatzfunktionen, um den Status eines Benutzers abzufragen, wie
IsOnline oder GetNumberOfUsersOnline, die sich zum Beispiel gut dafür eignen auf einer Administrationseite anzuzeigen
welche User gerade angemeldet sind. Bezugspunkt für diese beiden Eigenschaften bzw. Methoden ist das Feld LastActivityDate,
in dem die letzte Aktivität des Users festgehalten wird, und die Membership-Eigenschaft UserIsOnlineTimeWindow.
Aus der Differenz errechnet sich, ob ein Benutzer noch online ist oder vielleicht nicht (ASP.NET ist halt zustandslos).
Problem
Beim Einsatz des Profile-Providers gibt es dabei allerdings einen Haken: sobald auf ein Profil-Feld zugegriffen wird, aktualisiert der
Provider das LastActivityDate des dazugehörigen Benutzers! Das ist das Phänomen, dass vielleicht einige Admins kennen. Man lädt
die User-Liste mit zusätzlichen Informationen aus dem Profil und scheinbar sind alle User gerade online...
Schuld daran ist die server-seitige Implementierung der Provider. Möchte man eine Datenbank für deren Verwendung fitmachen, so erzeugt
zum Beispiel das SQL-Server-Registrierungs-Tool
aspnet_regsql.exe auf der angegebenen Datenbank alle Tabellen, Views und Stored Procedures, die benötigt werden.
Unter anderem wird eine Stored Procedure namens aspnet_Profile_GetProperties aufgespielt mit folgendem Inhalt:
Diese SP wird von der Methode GetPropertyValuesFromDatabase der Klasse SQLProfileProvider aufgerufen, die dafür
zuständig ist, die Daten aus der Datenbank auszulesen.
Was heisst das im Klartext: "zeig mir das Feld XY aus dem Profil und ich tue anschließend so, als wäre es der Benutzer selbst gewesen". Für meinen
Geschmack etwas unsinnig, vor allem wenn man zum Beispiel den Vor- und Nachnamen eines Benutzers im Profil abgelegt hat und ihn schlicht irgendwo auf
der Seite (User-Kommentare oder ähnliches) anzeigen möchte.
Lösung
Einfach die fünf Zeilen SQL-Code auskommentieren und schon wird LastActivityDate erst wieder aktualisiert, wenn der Benutzer wirklich
online ist.