2009-07-25 9 views
1

Ich traf mit seltsamen Sitzungsproblem. Ich habe eine Website entwickelt, die eine Sitzung verwendet, um benutzerspezifische Informationen zu verfolgen, um festzustellen, ob ein bestimmter Benutzer die Berechtigung hat, auf einen Teil der Website zuzugreifen. Ich verwende VSTS 2008 + .Net 3.5 + C#, um die ASP.Net-Website zu entwickeln.Http Sitzung Ausgabe

In meinem Design, wenn ich auf http://mysite/sitemanager zugreifen, wenn Benutzer keine Sitzungs-ID verfügbar ist, werden die Benutzer aufgefordert, ihren Benutzernamen und ihr Passwort einzugeben (wenn passierte Passwort-Überprüfung, verfügbare Sitzungs-ID gewährt wird); Wenn die Sitzungs-ID verfügbar ist, bedeutet dies, dass der Benutzer über eine Site-Management-Berechtigung verfügt und authentifiziert wird. Dann sollten alle Funktionen des Site-Managers für den Benutzer zugänglich sein - d. h. alle Login-Benutzer haben die Berechtigung, auf den Site-Manager zuzugreifen.

Das Problem Szenario ist wie diese,

  1. I http://mysite/sitemanager von einem neuen IE-Fenster zugreifen, da ich vorher nicht anmelden, und ich werde anmelden meine Anmeldeinformationen und gewährt Site-Management Erlaubnis verwenden,
  2. dann Ich (nicht schließen IE) geben http://www.google.com in die Adressleiste des gleichen IE-Fenster zu ersetzen http://mysite/sitemanager, Google apprears,
  3. dann füge ich Adresse http://mysite/sitemanager in das gleiche IE-Fenster Zugriff, ich bin überrascht, ich bin nicht um Erlaubnis bitten Passwort eingeben.

Irgendwelche Ideen, was ist los? Was ich will, ist in Schritt (3) Benutzer sollte aufgefordert werden, ein Passwort einzugeben.

Antwort

2

Ihre Sitzung wurde nicht beendet, nur weil Sie die Website verlassen haben. Eine Sitzung bleibt für ihre Zeitüberschreitung seit der letzten Interaktion mit der Site aktiv. Aus diesem Grund ist die Sitzungsinformation noch vorhanden.

Um Ihren Kommentar zu beantworten, können Sie eine Sitzung beenden, indem Sie Session.Abandon() aufrufen. Wenn Sie dies tun möchten, wenn jemand die Site verlässt, schlage ich vor, dass Sie einen Ajax-Aufruf für das Unload-Client-Ereignis der Seite ausführen, das wiederum Session.Abandon() aufruft oder die Anmeldeinformationen zumindest zurücksetzt. Dies kann jedoch schwierig sein, da das Entladen auch dann aufgerufen wird, wenn Sie die Seite für eine andere Seite auf Ihrer eigenen Website verlassen, also müssen Sie auch danach suchen. Und ja, es ist Absicht. Das Standard-Sitzungszeitlimit beträgt 20 Minuten, sofern Sie nichts anderes angeben.

+1

Dank SirDemon, 1. meinst du es ist von Entwurf, nicht meine Code-Fehler auf der Serverseite? 2. irgendeine Lösung, um den Benutzer in Schritt (3) seinen Benutzernamen und sein Passwort einzugeben? – George2

+0

Dank SirDemon, hast du einen ähnlichen kniffligen Code zu teilen? Ich mag und möchte deinen Ajax-Code ausprobieren. :-) – George2

+0

Meinst du unload client event wird ausgelöst, wenn ich eine andere URL (Google in meinem Beispiel) eingib und auf die neue URL gehe? – George2

2

Der Sitzungsstatus geht nur verloren, wenn der Benutzer das Sitzungscookie löscht, das Ihr Server ihm gegeben hat. Oder der Benutzer stellt keine Anforderung für einen bestimmten Zeitraum (Session.TimeOut Eigenschaft). Oder wenn Sie es in Ihrem Code aufgeben.

+1

Dank çağdaş, 1. meinst du, es ist von Entwurf, nicht meine Code-Fehler auf der Serverseite? 2. Ich denke, dass die Sitzung in einem Cookie implementiert ist. Das heißt, selbst wenn ich auf Google zugreife, behält IE mein Sitzungscookie für http: // mysite/sitemanager? Es ist sehr verwirrend, da ich die Domain (Google) ändere, aber IE behält Sitzungsinformationen für vorherige Domain (mysite) 3. irgendeine Lösung, um Benutzer in Schritt (3) ihren Benutzernamen und Passwort eingeben zu lassen? – George2

+1

1. Ja, es ist von Entwurf. Nichts ist falsch mit deinem Code. 2. Es ist in der Tat ein Cookie, aber es wird gelöscht, wenn der Browser geschlossen wird. 3. Ich denke nicht, dass du das kannst. Ich denke auch nicht, dass Sie versuchen sollten, das zu implementieren. Stellen Sie sich vor, Ihr Nutzer browst Ihre Website, während er nach etwas auf Google sucht. Aus diesem Grund wird er von Ihrer Website ausgeloggt. –

+0

Danke çağdaş, mein Szenario ist der Endbenutzer kann freigegebenen Computer verwenden. Ich möchte nicht, dass der zweite Benutzer die Berechtigung des ersten Benutzers verwendet. :-) Weitere Tipps für mein Problem? Schätze, wenn irgendeine Lösung möglich wäre. – George2

1

So funktionieren Web-Sessions überall. Um überraschende Benutzer zu vermeiden; Es ist wahrscheinlich am besten, wenn Sie dieses Verhalten akzeptieren.


Aber wenn Sie wirklich wollen, um Ihre Benutzer, um sich abzumelden, wenn sie Ihre Website nicht mehr verwenden, ist hier, wie ...

Anstatt das Unload-Ereignis mit (was problematisch sein werden wird zu implementieren, da es schwer zu sagen, wenn jemand wirklich Ihre Website verlässt - und was passiert, wenn sie zwei Fenster auf Ihrer Website geöffnet haben?), würde ich vorschlagen, die Sitzung Zeitüberschreitung auf 1min zu verkürzen, und mit einem Client-Keepalive: im Wesentlichen pingt der Browser Server alle paar Sekunden (z. B. 10) bei einer vorgegebenen URL, was absolut nichts weiter bewirkt, als die Sitzung am Leben zu erhalten.

Dies kann bei Bedarf ohne Javascript über einen iframe auf eine Seite mit einem Meta-Refresh-Tag implementiert werden.Es wäre natürlich in Javascript robuster und einfacher, aber ein versteckter Iframe ist nicht zu komplex, noch ist ein Meta-Tag. Wenn die serverseitige Aktualisierungsseite das Senden 304 Not-modified unterstützt, haben Sie auch eine sehr niedrige Overhead-Lösung.

In Ihrer Hauptdatei würde man immer auch so etwas wie:

<iframe src="keepalive.aspx" width="1" height="1" /> 
<!--and perhaps use css to hide the iframe - but test that!--> 

Und in keepalive.aspx Sie umfassen würde:

<meta http-equiv="refresh" content="5" /> 

schließlich als Bandbreite Optimierung, in Mit dem Code für keepalive.aspx können Sie einen Last-Modified-Antwortheader hinzufügen und überprüfen, ob der Browser einen If-Not-Modified-Since-Anforderungsheader gesendet hat. Wenn dies der Fall ist, senden Sie anstelle des vollständigen Dokuments ein 304 Not-Modified .

Schließlich, wenn Sie sowieso Javascript-abhängig sind (viele solcher Login-basierten Web-Anwendungen sind), können Sie stattdessen einfach Ihre Lieblings-Ajax-Frameworks, um eine Anfrage auch durchführen - ohne die Iframe.

+0

Vielen Dank Eamon, warum wird es Probleme bei der Implementierung von Unload-Ereignissen geben, wenn "wenn sie zwei Fenster zu Ihrer Site geöffnet haben", könnten Sie mir bitte weitere Details mitteilen? – George2

+0

Ein weiterer interessanter Punkt ist, dass die Verwendung von Ajax die Bandbreite und die Arbeitslast auf der Serverseite im Vergleich zur Verwendung des Last-Modified-Antwortheaders signifikant reduziert. – George2

+0

Nein, 304-Nicht-modifiziert und AJAX sind beide "fast frei" sowohl in Bezug auf CPU und Bandbreite; Sie können beide mit benutzerfreundlichen IHttpHandlern mit geringem Gewicht implementiert werden. Sie könnten wahrscheinlich eine Million Kunden auf einer Box bedienen, wenn das alles ist - also machen Sie sich keine Sorgen darüber; Ihre Engpässe werden woanders liegen (zum Beispiel in der Sitzung). –

Verwandte Themen