Session.Aabndon
Tobi
- asp.net
Hallo,
ich bin dabei eine Benutzerverwaltung zu schreiben. Authentifizierung soll ueber Sessions laufen.
Ich bin aber bei ASP Sessions noch Anfaenger, also bitte um Verstaendnis fuer meine Fragen:
Wenn ich das richtig verstanden habe, werden Session >Objekte< serverseitig gespeichert, Session >Cookies< clientseitig. (Stimmt das?)
Wenn ich jetzt Session.Abandon benutze, werden dann alle Sessions serverseitig geloescht? Das wuerde ja dann bedeuten, dass wenn mehrere Benutzer gerade eingeloggt sind, alle ausgeloggt wuerden...das will ich natuerlich nicht. D.h. wahrscheinlich wird mit Session.Abandon nur clientseitig geloescht?
Wenn ich aber jetzt einem Administrator die Moeglichkeit geben moechte, User - die gerade online sind - auszuloggen, wie kann ich das bewerkstelligen? Nur ueber eine Datenbank (o.ae.) in der Online (false/true) abgefragt wird, oder bietet da das Session Objekt auch eine Moeglichkeit?
Waere fuer Hilfe sehr dankbar,
Gruss
Tobi
Hi !
Wenn ich das richtig verstanden habe, werden Session >Objekte< serverseitig gespeichert, Session >Cookies< clientseitig. (Stimmt das?)
Das ist soweit korrekt.
Wenn ich jetzt Session.Abandon benutze, werden dann alle Sessions serverseitig geloescht? Das wuerde ja dann bedeuten, dass wenn mehrere Benutzer gerade eingeloggt sind, alle ausgeloggt wuerden...das will ich natuerlich nicht. D.h. wahrscheinlich wird mit Session.Abandon nur clientseitig geloescht?
Session.Abandon sorgt dafür, dass die betroffene Session (also nur eine) Serverseitig gelöscht wird, so dass auch wenn ein Client mit dem ehemals passenden Cookie wieder auf die Seite kommt, er keine dazu passende Session mehr findet.
Wenn ich aber jetzt einem Administrator die Moeglichkeit geben moechte, User - die gerade online sind - auszuloggen, wie kann ich das bewerkstelligen? Nur ueber eine Datenbank (o.ae.) in der Online (false/true) abgefragt wird, oder bietet da das Session Objekt auch eine Moeglichkeit?
Tja, die Antwort ist nicht so einfach. Das ist das alte Problem, "wie stelle ich fest wer alles online ist". In der Regel muss man dazu etwas tricksen und sich in der Datenbank Aktivitäten o.ä. protokollieren. Das ist alles etwas lästig, zumal es den Vorteil des Session zerstört: Die Session kann sich ja gerade Daten über die verschiedenen Seiten merken OHNE die Datenbank zu kontaktieren, wenn man das jetzt also trotzdem muss, wäre das sehr schade.
Ich habe mich noch nicht intensiver damit beschäftigt, aber es gibt in ASP noch das APPLICATION-Objekt, das noch überhalb des Session-Objektes steht und globale Daten enthält. Ich glaube allerdings nicht, dass du mit dessen Hilfe sowas bewerkstelligen könntest (außer wieder mit Trick, so a la (keine Ahnung ob die Syntax stimmt):
Admin-Seite:
Application("destroyusers") = "PersonA, PersonB, PersonC"
beliebige Seite:
If (InStr(Application("destroyusers"), Session("Benutzername")) >= 0) then
Session.Abandon
Response.Write("Ihre Session wurde beendet.")
Response.End
end if
Rouven
Hallo Rouven,
Session.Abandon sorgt dafür, dass die betroffene Session (also nur eine) Serverseitig gelöscht wird, so dass auch wenn ein Client mit dem ehemals passenden Cookie wieder auf die Seite kommt, er keine dazu passende Session mehr findet.
Okay, d.h. also, es wird nur die Session mit der fuer diesen User gueltigen SessionID serverseitig geloescht, andere User sind dann davon nicht betroffen?
Tja, die Antwort ist nicht so einfach. Das ist das alte Problem, "wie stelle ich fest wer alles online ist". In der Regel muss man dazu etwas tricksen und sich in der Datenbank Aktivitäten o.ä. protokollieren. Das ist alles etwas lästig, zumal es den Vorteil des Session zerstört: Die Session kann sich ja gerade Daten über die verschiedenen Seiten merken OHNE die Datenbank zu kontaktieren, wenn man das jetzt also trotzdem muss, wäre das sehr schade.
Genauso sehe ich das auch....
Ich habe mich noch nicht intensiver damit beschäftigt, aber es gibt in ASP noch das APPLICATION-Objekt, das noch überhalb des Session-Objektes steht und globale Daten enthält. Ich glaube allerdings nicht, dass du mit dessen Hilfe sowas bewerkstelligen könntest (außer wieder mit Trick, so a la (keine Ahnung ob die Syntax stimmt)
Ich habe da in einem fremden Login-Script etwas in der global.asa gefunden, was deinem Beispiel nahe kommt:
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
Application("ActiveUsers") = 0
End Sub
Sub Session_OnStart
Session.Timeout = 20
Session("Start") = Now
Application.Lock
Application("ActiveUsers") = Application("ActiveUsers") + 1
Application.UnLock
End Sub
Sub Session_OnEnd
Application.Lock
Application("ActiveUsers") = Application("ActiveUsers") - 1
Application.UnLock
End Sub
</SCRIPT>
Es zaehlt aber nur die User, die gerade online sind inkl. nach Session timeout ausgeloggte Benutzer, wenn ich das richtig sehe. (Das birgt naemlich ein weiteres Problem: Was, wenn der User sich nicht ueber ein Logoff-Script ausloggt?)
Allerdings ist mir unklar, wie ich "fremde" serverseitige Session-Objekte identifizieren, abfragen und loeschen kann. (Wenn ich Dich richtig verstadnen habe, wird mit Abandon ja nur die eigene Session geloescht - Dein Instr erscheint mir so nicht moeglilch wenn ich mir den obigen Code in der global.asa anschaue, da Application nicht uebergeordnet der Session ist...)
Hast Du noch eine andere Idee?
Danke & Gruss
Tobi
Admin-Seite:
Application("destroyusers") = "PersonA, PersonB, PersonC"beliebige Seite:
If (InStr(Application("destroyusers"), Session("Benutzername")) >= 0) then
Session.Abandon
Response.Write("Ihre Session wurde beendet.")
Response.End
end ifRouven
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
Application("ActiveUsers") = 0
End Sub
Sub Session_OnStart
Session.Timeout = 20
Session("Start") = Now
Application.Lock
Application("ActiveUsers") = Application("ActiveUsers") + 1
Application.UnLock
End Sub
Sub Session_OnEnd
Application.Lock
Application("ActiveUsers") = Application("ActiveUsers") - 1
Application.UnLock
End Sub
</SCRIPT>
OK, das Skript sagt schon mal einiges. Das mit den nicht-"logoff"-Sessions ist auch nicht wirklich ein Problem, der zerstört der Server nach einer bestimmten Inaktivität automatisch, bei meinem Provider z.B. 20 min.
So, jetzt mal zu Application und Session:
Ich habs nicht ausprobiert, wie gesagt, habe das app-Objekt bisher nicht genutzt. Aber mein Visual Studio bietet mir die Verwendung innerhalb einer beliebigen ASP-Seite an.
Nehmen wir also folgendes an: Ich habe meiner Application in einem String mitgeteilt, welche UserNames ich kicken will, dann geht es jetzt nur noch darum, bei irgend einem Seitenaufruf nachzugucken, ob mich das betrifft.
Sagen wir mal, ich wolle einem Nutzer mitteilen, er ist im Moment gebannt. ich setze also seinen UserName in das Application-Objekt (wie ich das dort drin verwalte, so mit Array oder String sei mal dahin gestellt) - dann nehme ich mir z.B. die login.asp:
Ich stelle zunächst fest "Benutzername und Passwort stimmen überein - soll ich denn sonst noch was beachten?" - Wenn ich mir jetzt meinen bann nicht in die DB sondern die Application geschrieben habe gehe ich schlicht und einfach hin und sage:
If (Session("benutzername") = Application("gebannt")) then ...
-> unter der Annahme, in gebannt stünde nur genau ein Benutzername drin, das meinte ich oben mit Verwaltung...
Ich mache mir also die globalen Variablen über alle Sessions hinweg zu nutze um meine einzelne Session zu beeinflussen (das ist wie ein Client auf dem Server selbst, mein Skript ist ja quasi der Anwendung untergeordnet).