Tobi: Session.Aabndon

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

  1. 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

    1. 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 if

      Rouven

      1. <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).