Statische Variablen in ASP.NET
Ein Beispiel aus dem Alltag: Ich baue einen Teil einer Webanwendung, die etwas aus einer bestimmten fertigen Datenbank anzeigen soll. Dazu bekomme ich einen fertigen Business Layer, der alle Daten aufbereitet, Berechtigungen prüft, etc.
Ich habe den BL eingebaut, alles läuft, keine Fehler. Ich fange an zu testen.
Ich logge mich in die Anwendung ein und lasse mir die Daten ausgeben und bin zufrieden.
Ich logge mich anschließend mit einem neuen Browser und einem anderen User – mit weniger Berechtigungen – in die Anwendung ein und lasse mir abermals die Daten ausgeben, ich sehe alle Daten und bin ebenfalls zufrieden.
Ich logge mich nun mit einem User ein, der fast keine Berechtigungen hat und lasse mir die Daten ausgeben und bin nicht zufrieden, denn ich sehe die Daten, was nicht sein darf.
Nun schaue ich mir meine Arbeit noch mal an, finde keinen Fehler und starte die Anwendung neu.
Ich logge mich nun mit dem letzten Benutzer ein und möchte mir das Problem noch mal anschauen. Und siehe da… Ich bekomme keine Daten angezeigt, was richtig ist.
Ich nehme meinen zweitletzten User logge mich ein und sehe keine Daten?!?!
Ich logge mich mit meinen eigenen Zugang ein … und sehe keine Daten?!?!?!?!
Was passiert hier?
So langsam schöpfe ich Verdacht… es werden immer die Berechtigungen des Users verwendet, der sich als erste nach einem Neustart der Anwendung eingeloggt hat!
Die Berechtigungen werden vom BL in einer statischen Variablen zwischengespeichert, um nicht immer wieder neu ermittelt werden zu müssen. Da sich statische Variable im ASP.NET wie Application Variablen verhalten – ganz egal, ob diese sich in einer externen Library befinden oder im Webprojekt – sind diese immer und überall für alle User sichtbar.
Ein kleines Beispiel um das Problem nachzuvollziehen:
public class TestClass
{
private static string sessionId;
public static string getSessionId(string SessionId)
{
if (sessionId == null)
sessionId = SessionId;
return sessionId;
}
}
Meine Testklasse mit den statischen Members
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.lblOwnSessionId.Text = Session.SessionID;
this.lblStaticSessionID.Text = TestClass.getSessionId(Session.SessionID);
}
}
Die CodeBehind meiner Test ASP.NET Seite.
Die angezeigten Session IDs unterscheiden die einzelnen User. Die erste Session ID ist die des aktuellen Benutzers, die zweite Session ID ist die, die in einer Statischen Variablen zwischengespeichert wird.
Ihr werdet sehen, dass die Zweite Session ID die des Users ist, der die Anwendung als erste Aufgerufen hat und sich nicht mehr ändert, bis die Application neu gestartet wird. Alle anderen User können diese Session ID sehen.
Hier noch die Anwendung zum selber testen:
hier downloaden