Kann ich eine ASP.Net-Sitzungs-ID in einem ausgeblendeten Formularfeld ablegen?

9

Ich verwende den Yahoo Uploader, Teil der Yahoo UI-Bibliothek, auf meiner ASP.Net-Website, damit Benutzer Dateien hochladen können. Für diejenigen, die nicht vertraut sind, verwendet der Uploader ein Flash-Applet, um mir mehr Kontrolle über den FileOpen-Dialog zu geben. Ich kann einen Filter für Dateitypen angeben, mehrere Dateien auswählen usw. Es ist großartig, aber es hat die folgende dokumentierte Einschränkung:

  

Aufgrund eines bekannten Flash-Fehlers sendet der in Firefox unter Windows laufende Uploader beim Hochladen keine korrekten Cookies. Anstatt Firefox-Cookies zu senden, sendet es Internet Explorer-Cookies für die jeweilige Domain. Als Workaround empfehlen wir, entweder eine cookielose Upload-Methode zu verwenden oder document.cookie an die Upload-Anfrage anzuhängen.

Wenn also ein Benutzer Firefox verwendet, kann ich mich nicht darauf verlassen, dass Cookies beim Hochladen einer Datei ihre Sitzung beibehalten. Ich brauche ihre Sitzung, weil ich wissen muss, wer sie sind! Als Workaround verwende ich das Application-Objekt so:

%Vor%

Ich erstelle also eine eindeutige ID und verwende sie als Schlüssel, um das Objekt Page.User im Anwendungsbereich der Anwendung zu speichern. Ich füge diese ID als eine Variable in den POST ein, wenn die Datei hochgeladen wird. Dann nehme ich in dem Handler, der den Datei-Upload akzeptiert, das User-Objekt so:

%Vor%

Das funktioniert tatsächlich, aber es hat zwei eklatante Nachteile:

  • Wenn IIS, der App-Pool oder auch nur die Anwendung zwischen dem Zeitpunkt, an dem der Benutzer die Upload-Seite besucht und tatsächlich eine Datei hochlädt, neu gestartet wird, wird ihre "uploadid" aus dem Anwendungsbereich der Anwendung gelöscht und der Upload schlägt fehl Ich kann sie nicht authentifizieren.

  • Wenn ich jemals auf ein Webfarm-Szenario (möglicherweise sogar einen Web-Garten) skaliere, wird das komplett kaputt gehen. Ich mache mir vielleicht keine Sorgen, außer dass ich diese App in Zukunft skalieren werde.

Hat jemand einen besseren Weg? Gibt es eine Möglichkeit für mich, die tatsächliche ASP.Net-Sitzungs-ID in einer POST-Variablen zu übergeben und diese ID dann am anderen Ende zum Abrufen der Sitzung zu verwenden?

Ich weiß, dass ich die Sitzungs-ID über Session.SessionID abrufen kann, und ich weiß, wie ich YUI verwende, um es auf die nächste Seite zu stellen. Was ich nicht weiß ist, wie man SessionID verwendet, um die Sitzung vom Statusserver zu holen.

Ja, ich verwende einen Statusserver, um die Sitzungen zu speichern, damit sie den Neustart von Anwendungen / IIS beibehalten und in einem Webfarmszenario funktionieren.

    
Josh Hinman 04.09.2008, 08:08
quelle

4 Antworten

3

Hier ist ein Beitrag des Betreuers von SWFUpload , in dem erläutert wird, wie die Sitzung von einer in Request.Form gespeicherten ID geladen wird. Ich stelle mir vor, dass das gleiche für die Yahoo-Komponente funktionieren würde.

Beachten Sie die Haftungsausschlüsse für die Sicherheit am Ende des Posts.

  

Indem Sie eine Global.asax-Datei und den folgenden Code hinzufügen, können Sie den fehlenden Sitzungs-ID-Cookie überschreiben:

%Vor%
  

Sicherheitswarnung: Kopieren Sie diesen Code nicht einfach in Ihre ASP.Net-Anwendung, ohne zu wissen, was Sie tun. Es führt Sicherheitsprobleme und Möglichkeiten von Cross-Site-Scripting ein.

    
Jonas 26.10.2008, 07:12
quelle
1

Sie können Ihre aktuelle SessionID aus dem folgenden Code abrufen:

%Vor%

Dann kannst du das vielleicht in ein verstecktes Feld eintragen und dann auf diesen Wert durch YUI zugreifen.

Es ist nur ein Sprung, also werdet ihr hoffentlich keine Skalierungsprobleme haben. Sicherheitsprobleme, die ich nicht kenne.

    
Seb Nilsson 04.09.2008 08:42
quelle
1

Unter diesen Blogpost , hier ist eine Funktion, die Ihnen die Sitzung für jeden Benutzer basierend auf der Sitzungs-ID bringen soll, obwohl es nicht hübsch ist:

%Vor%     
Pluto 10.09.2014 00:49
quelle
0

Die ASP.Net-Sitzungs-ID wird in Session.SessionID gespeichert, sodass Sie sie in einem ausgeblendeten Feld festlegen und dann auf die nächste Seite stellen können.

Ich denke jedoch, dass die Sitzungs-ID abläuft, wenn die Anwendung neu gestartet wird, wenn Sie Ihre Sitzungen auf dem SQL-Server nicht speichern .

    
Espo 04.09.2008 08:41
quelle

Tags und Links