Session Management

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
JanR
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 129
Registriert: Di, 18. Okt 2005 14:44

Session Management

Beitrag von JanR »

Hallo,

ich kämpfe gerade mit dem WAA und komme mit dem Session Management überhaupt nicht klar. Kann mir dazu vielleicht jemand mal etwas in verständlicher Form erzählen? Die WAA Doku ist ja nicht sonderlich informativ :(.

Wenn ich es richtig verstanden habe, braucht doch jeder User eine Session, also eine ID oder?


Dankeschön.

Jan
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Session Management

Beitrag von Tom »

Hallo, Jan.

Ich benutze Xb2.Net für Serveranwendungen, aber das dürfte sich ähneln. Je Session wird dort ein Thread gestartet (eigentlich sind es sogar mehrere, aber das spielt in diesem Zusammenhang keine Rolle). Je Nutzer wird eine ein-eindeutige Session-ID vergeben, weil die für die (ja nicht-persistente!) Verbindung als eindeutiger Identifier dient (Du willst nicht Nutzer 2 die Antwort für Nutzer 1 schicken). Wenn Du mit Multithreading arbeitest und je Session einen Thread eröffnest (nicht vergessen, ihn wieder zu töten), sind designseitig auch keine weiteren Tricks nötig.
Herzlich,
Tom
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Session Management

Beitrag von Armin »

Hallo Jan,

man braucht nicht unbedingt eine Session. Nur wenn Du auch eine Benutzeranmeldung benötigst, solltest Du wissen, wo der Request herkommt. Eine SessionID ist eine eindeutige Nummer, die Du einer Session zuordnen kannst. Eine Session ist normalerweise ein Cookie. Du kannst aber auch auf ein Cookie verzichten, wenn Du z.B. diese ID in jede URL mit einbaust und übergibst. Das Cookie wird über das Context-Objekt verwaltet.

Wir haben z.B. eine Intranet-Anwendung und greifen mit oContext:getRemoteUser() auf die Windowsanmeldung zu - muß im Browser entsprechend eingestellt werden. Wir verzichten auf eine extra SessionID.

Grüße, Armin
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Session Management

Beitrag von Armin »

Hallo Jan,

z.B. automatischer Login mit Windows-Benutzer:

Code: Alles auswählen

FUNCTION Login( oHTML, oContext )
...
   cRemoteUser := trim(oContext:getRemoteUser())
   if !empty(cRemoteUser)
      nPosSlash := rat("\",cRemoteUser)
      if nPosSlash > 0
         cName := right(cRemoteUser, len(cRemoteUser)-nPosSlash)
      else
         cName := cRemoteUser
      endif
   else
      // aus Login-HTML
      cName  := oHTML:getVar( "TheName" )     
      cLangu := oHTML:getVar( "TheLanguage" )
   endif
   success := oContext:setCargo("RemoteUser", cRemoteUser)
Wenn Du eine Session-ID benutzen willst (eindeutige zufällige Kennung... generieren mit random() oä) kannst Du diese auch in eine Cargo-Variable schreiben (Session-Var).
z.B.
oContext:setCargo("SID", cSID)

und bei jedem Aufruf einer WAA-Funktion lesen:
cSID := oContext:getCargo("SID")

hdh, Armin
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Session Management

Beitrag von brandelh »

Hi,

ob man eine Session-ID braucht hängt vom Einsatzzweck ab. Wenn man wie auf einer normalen WebSite nur Infos
zum Lesen anzeigt und sonst nichts wissen muss, braucht man keine.

Wenn du aber z.B. Zugriffskontrolle / Anmeldung / Seitenhistorie oder was weis ich brauchst, dann musst dein
CGI/Server Programm genau unterscheiden können wer diese eine Anfrage sendet. Dafür braucht man session IDs.

Wie man die dann anlegt ist wieder eine andere Frage ;-)
Gruß
Hubert
JanR
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 129
Registriert: Di, 18. Okt 2005 14:44

Re: Session Management

Beitrag von JanR »

Vielen vielen Dank. Das hilft mir doch schon sehr weiter :).
JanR
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 129
Registriert: Di, 18. Okt 2005 14:44

Re: Session Management

Beitrag von JanR »

Hi Ihr Web Profis :D,

also irgendwie steig ich bei dem Session Management noch nicht so richtig durch.

Starte ich die WAA Anwendung, wird erstmal eine Session ID vergeben. Die speichere ich dann mit setCargo in einer Variablen. Bei jeder Funktion hole ich mir die Session ID wieder mit getCargo. Das klappt auch soweit. Wenn ich jetzt aber ein zweites Browser Fenster öffne und wieder die WAA Anwendung starte, gibt es ein durcheinander zwischen den beiden Sessions. Was mache ich falsch?


Gruß Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Session Management

Beitrag von brandelh »

Hi,
eigentlich sollte jede Browsersitzung eine eigene SessionID haben,
ich weiß aber nicht wie der WAA das handled ...
Bei dem Forum HIER ist es wohl so, dass man per cockie angemeldet ist, das auf dem Rechner liegt.
Ein Rechner ein cockie, alle haben die gleiche session ID.
Für das Forum ist das auch OK, man kann mit mehreren Sitzungen gleichzeitig arbeiten ... als Multiusertest
funktioniert es halt nicht.
Gruß
Hubert
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Session Management

Beitrag von Armin »

Hallo Jan,

das liegt daran, dass nur 1 Cockie im Browser abgelegt wird.

Die 2.Session kannst Du in diesem Fall z.B. mit einem anderen Browser öffnen - also z.B. Session 1 mit dem IE und die 2.mit dem Firefox.

Ich empfehle Dir die Variablen, d.h. in diesem Fall die Session-ID, alle in das HTML zu speichern und von dort wieder einzulesen. Das ist die sicherste Methode.

Grüße, Armin
JanR
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 129
Registriert: Di, 18. Okt 2005 14:44

Re: Session Management

Beitrag von JanR »

Hallo Ihr beiden,

Cookies verwende ich eigentlich garnicht oder legt set/getCargo welche an? Hab das jede mit 2 Browsern von 2 verschiedenen PC's ausprobiert, aber der mischmasch bleibt leider. Scheint an irgendeiner anderen Stelle wohl etwas falsch zu laufen :(.
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Session Management

Beitrag von Armin »

Hallo Jan,
Starte ich die WAA Anwendung, wird erstmal eine Session ID vergeben. Die speichere ich dann mit setCargo in einer Variablen.
Du legst mit setCargo eine Coockie-Variable an!

Und mit getCargo liest Du sie aus.

Coockies bleiben im Browser erhalten, wenn Du sie nicht löscht. D.h. Deine vorhergehende Session wird wieder aufgenommen. D.h. vor Test löschen...

Grüße, Armin
JanR
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 129
Registriert: Di, 18. Okt 2005 14:44

Re: Session Management

Beitrag von JanR »

Hallo Armin
Ich empfehle Dir die Variablen, d.h. in diesem Fall die Session-ID, alle in das HTML zu speichern und von dort wieder einzulesen. Das ist die sicherste Methode.
Wie meinst du das?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Session Management

Beitrag von brandelh »

Hi,

vermutlich meint er die Hidden Variablen im HTML CODE ...

Code: Alles auswählen

<INPUT TYPE="HIDDEN" NAME="SESSIONID"     VALUE="{sessionid}"></INPUT>
<INPUT TYPE="HIDDEN" NAME="USERNAME"      VALUE="{username}"></INPUT>
<INPUT TYPE="HIDDEN" NAME="PROGSTAT"      VALUE="{progstat}"></INPUT>
die dann mit dem jeweiligen Variablen Inhalt ausgefüllt werden.

Code: Alles auswählen

cHTML := strTran(cHTML,"{sessionid}",cSessionID)
...
so mache ich es bei meinen CGI Programmen.
Gruß
Hubert
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Session Management

Beitrag von Armin »

Hallo,

ja zum Beispiel so. Dann ist immer klar, von welchem Browser-Fenster der WAA-Aufruf kommt.
Die Session-ID kann aber schon als Cookie gespeichert werden. Das ist ja eigentlich auch ihr Sinn, sie dient ja als Anmeldung - dann sind alle Fenster/Tabs dieses Browsers angemeldet. Dies sollte auch funktionieren.
Wenn man die Session-ID aber in das HTML schreibt und von dort wieder liest, ist es auch egal ob der Benutzer Cookies akzeptiert.

Grüße, Armin
JanR
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 129
Registriert: Di, 18. Okt 2005 14:44

Re: Session Management

Beitrag von JanR »

Hi,

nochmal zum Verständnis:

- :openSession() braucht man immer. Auch wenn ich eine eigene Session ID generiere

- :setCargo() legt Cookie-Variablen an. Wenn ich das nicht will, lege ich die Variablen
im HTML Code an.

Habe ich das richtig verstanden?

Gruß Jan
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Session Management

Beitrag von Armin »

Hallo Jan,

ich glaube :openSession() braucht man nur für die Möglichkeit, Cargo-Variablen, bzw. Cookies zu verwalten.
- :setCargo() legt Cookie-Variablen an. Wenn ich das nicht will, lege ich die Variablen
im HTML Code an.
ja!
Nach meiner Meinung ist tatsächlich die sinnvollste Cargo-Variable die Session-ID.

Alle anderen Variablen sollten besser im HTML oder auf dem Server unter der Session-ID abgelegt sein.
Die Benutzer haben mit einem Browser z.B. die Möglichkeit einen HREF in einem eigenen Fenster/ Tab zu öffnen oder direkt die URL einzugeben. Somit können plötzlich mehrere Fenster mit unterschiedlichen Daten geöffnet sein. So können z.B. von der gleichen Session für 2 unterschiedliche Artikel ein Artikeldatenblatt angefordert werden - würde die Artikelnummer jetzt in einer Sessionvariable stehen, hätte man die vom letzten geöffneten Fenster... Das vorhergehende kann aber immer noch geöffnet sein. Deshalb solche Variablen immer ins HTML schreiben.

Daten rund um die Session, bzw. Benutzeranmeldung kann man sich auch unter der Session-ID auf dem Server speichern - dann kann auch weniger manipuliert werden...

Grüße, Armin
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: Session Management

Beitrag von andreas »

Entweder habe ich das immer falsch verstanden oder ihr macht einen Fehler.

So weit ich weiss, werden Cookies auf dem Client und die Sessions auf dem Server verwaltet!
Bei den Sessions gibt es so mit weniger möglichkeiten für die Sicherheitslöcher.
Wenn ich Cookies oder sogar die Daten in HTML speichere, gibt es dann eine große Wahrscheinlichkeit, dass der Server geknackt werden und unbefugter Datenzugriff erfolgen könnte! Davon würde ich abraten! Ausser, dass man die ID des angezeigten Datensatzes im HTML ablegt, damit man weisst, was der User sehen bzw. bearbeiten möchte.

Hier ist ein Beispiel für die Verwendung der Session, wobei die Session in jeder Funktion geöffnet und auf die Richtigkeit der Daten überprüft werden muss:

Code: Alles auswählen

FUNCTION LOGIN( oHTML, oContext )
  local lOK = .f.

*hier kommt die Überprüfung der Anmeldedaten

if lOK

  oContext:openSession()
  oContext:setCargo( "USER", alltrim((DBUSER)->username) )
  oContext:setCargo( "USERNAME", alltrim((DBUSER)->name) )
  oContext:setCargo( "KDNR", (DBUSER)->kdnr )
  oContext:setCargo( "KST", (DBUSER)->kstpflicht )
  oContext:setCargo( "PACKAGE", "WEBSERVICE" )

  *usw.

  Hauptseite( oHTML, oContext )

else
  *Fehler beim Anmelden
ENDIF

RETURN .t.

Code: Alles auswählen

FUNCTION Abmelden( oHtml, oContext )

	oContext:closeSession()
	oHTML:setLocation( "../index.html" )

RETURN nil

Code: Alles auswählen

FUNCTION Hauptseite( oHTML, oContext )                       
	LOCAL cUser := ""
	LOCAL cName := ""
	local nKdNr := 0

	oContext:openSession()

	cUser := oContext:getCargo( "USER" )                              
	cName := oContext:getCargo( "USERNAME" )                          
	nKdNr := oContext:getCargo( "KDNR" )

	IF cUser == NIL
		Abmelden( oHtml, oContext )
		RETURN nil
	ENDIF

	*hier kommt weitere Verarbeitung und Ausgabe

RETURN nil
Ich hoffe, dass es euch weiter hilft! Ich habe es am Anfang auch mit den Variablen in HTML gemacht und dann auf die Session umgestellt, da solche Seiten mehr Datensicherheit bieten!
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Session Management

Beitrag von brandelh »

Hallo Andreas,

hast du mal im Quellcode (Browser HTML Quellcode anzeigen) nachgesehen wie die Variablen im Browser angezeigt werden ?
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: Session Management

Beitrag von andreas »

Nein, habe ich nicht. Wie sehen die den aus?
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Session Management

Beitrag von brandelh »

Hallo Andreas,

da ich kein HTML Objekt benutze habe ich keine Ahnung was die Methoden daraus machen, daher frage ich ja ;-)

Ich vermute allerdings, dass dies auch einfach nicht angezeigte Variablen sind, somit nichts anderes als wenn man die Session-ID direkt in HTML Variablen übergibt.
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: Session Management

Beitrag von andreas »

Hallo Hubert,

in dem WAA-Server-Verzeichnis gibt es eine dbf-Datei, in der die Session-ID vorkommt und ein Memo-Feld mit den Daten vorhanden ist.
Normalerweise nach meinen Kenntnissen speichern alle Web-Server die Session-Infos nur auf dem Server, was wahrscheinlich auch bei WAA der Fall ist.
Wenn ich den Inhalt des Memo-Feldes in der Datei betrachte, kann ich die Variablennamen erkennen, die ich in der Session gespeichert habe.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Session Management

Beitrag von brandelh »

Und in dem Browser (HTML) Quellcode ist diese nicht enthalten ?
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: Session Management

Beitrag von andreas »

brandelh hat geschrieben:Und in dem Browser (HTML) Quellcode ist diese nicht enthalten ?
Nein, darf nicht vorkommen.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Session Management

Beitrag von Armin »

Hallo Andreas,

ja, hast Recht - in dem Cookie steht die Session-ID, die im Feld SESSION in WAA1SRV.DBF steht.

Das Problem mit Variablen, die Session-weit gültig sind ist z.B. wenn man den Browser mehrfach öffnet - z.B. eine Adresssuche und die Adressnummer als Session-Variable ablegt. Dann gilt diese Adressnummer für beide Fenster. Im 1. Fenster wird aber noch die 1.Adressnummer angezeigt, obwohl als SESSION-Variable die Adressnummer des 2.Fensters gespeichert wird. Klickt man jetzt im 1.Adressnummer z.B. auf Rechnungen pro Adresse und nimmt die Adressnummer aus der Session, dann zeigt man die Rechnungen der 2. Adresse an.

Zu vermeiden, dass mehrere Fenster geöffnet werden ist eigentlich nicht möglich.

Grüße, Armin
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: Session Management

Beitrag von andreas »

Hallo Armin,

ich kann dein Problem mit 2 Fenstern nicht nachvollziehen, weil ich es nicht ausprobiert habe.

Aber...
wenn du Firefox benutzt, startet dieser meines Wissens nach nur ein mal, obwohl du evtl. mehrere Fenster hast. Deswegen könnte es zu deinem beschriebenen Problem kommen. Versuch es mit unterschiedlichen Browsern, ob es immer noch so ist!
Gruß,

Andreas
VIP der XUG Osnabrück
Antworten