Kann ich eine InProc ASP.NET-Sitzung von einer Sitzung anders als einer, der die Anforderung aufgeben?

StackOverflow https://stackoverflow.com/questions/257843

Frage

Wir haben eine Anwendung, die Single Sign-On macht einen zentralen Authentifizierungs-Server (CAS) verwenden. Wir möchten, dass Single-Sign-out, so dass, wenn sich der Benutzer anmeldet aus einer Anwendung (zB ein Front-End-Portal) tun, wird der Benutzer automatisch aus allen Anwendungen die gleiche Single Sign-On-Ticket unterzeichnet werden.

Die Erwartung wäre, dass jede Anwendung eine Abmelde Haken (URL) mit dem CAS zum Zeitpunkt der Anmeldung zu dieser Anwendung registrieren würde. Wenn der CAS das Zeichen erhält Anforderung aus einer der Anwendungen, ruft sie den Abmelde Haken für die ganze Anwendung des SSO-Ticket zu teilen.

Meine Frage ist: Gibt es eine Möglichkeit, eine InProc-Sitzung von einer anderen Sitzung zu verlassen? Ich nehme an, da die HTTP-Anforderung von dem CAS-Server kommen wird, dass es seine eigene Sitzung zu bekommen, aber es ist die Sitzung des Benutzers, die ich beenden möchten. Ich habe ziemlich gute Vorstellung davon, wie dies zu tun, einen separaten Sitzungsstatus-Server verwenden, aber ich würde gerne wissen, ob es möglich ist, InProc Sitzungszustand verwendet wird.

War es hilfreich?

Lösung 2

Nach einem wenig Graben um zu tun und unter Berücksichtigung der bisher gegebenen Antworten Ich habe eine Alternative kommen, die mich weiterhin lassen InProc Sitzung verwenden. Im Grunde ist es besteht aus dem Httpmodule erstreckt, die bereits Single Sign-On zu erfasse CAS Zeichen outs Griffe und leiten Sie den Browser auf die Anwendung abzumelden Seite.

Outline:

Sign-On:

  1. Für jede neue Single Sign-On Anfrage, einen neuen SSO-Cookie erstellen und einen eindeutigen Wert kodieren darin die Sitzung (nicht die Session-ID, so dass es durchgesickert ist nicht) zu identifizieren.
  2. Erstellen Sie die das Abmelde Rückruf-URL, mit der Kennung codiert, und registrieren Sie es mit dem CAS-Server.

Sign-Out:

  1. Wenn eine Abmeldeanforderung von dem CAS-Server empfangen wird, dekodieren die Kennung und speichert sie in einem anwendungsweiten Cache. Dies muss im Cache zumindest lange genug für die Sitzung festgesteckt werden natürlich abläuft.
  2. Für jede Anforderung sucht die SSO-Cookie und prüfen Sie seinen Wert gegen die im Cache gespeicherten, signierten-out Session-IDs. Wenn es einen Treffer gibt, entfernen Sie das SSO-Cookie und Umleitung auf die Abmelde URL der Anwendung den Browser.
  3. Für jedes Zeichen-out, um zu sehen, ob es ein SSO-Cookie ist, wenn ja, leitet die Abmeldeanforderung an den CAS. In jedem Fall verlassen die Sitzung des Benutzers, und melden sie sich aus der Anwendung.

Page_Load:

  1. Überprüfen Sie das Vorhandensein des SSO-Cookie. Wenn es nicht ein, Umleitung auf das Zeichen aus Seite.

Andere Tipps

Haha, na ja ... Es sieht aus wie Sie können. Ich frage mich, mich, ob es eine Möglichkeit war, dies zu tun, stellt sich heraus, gibt es.

Wenn Sie InProc, die InProcSessionStateStore (interne Klasse) bestehen den Sitzungsstatus in einem internen (nicht öffentlich) Cache. Sie können diesen Cache durch Reflexion zugreifen und den Sitzungszustand manuell entfernen.

using System;
using System.Reflection;
using System.Web;

object obj = typeof(HttpRuntime).GetProperty("CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static)
        .GetValue(null, null);

if (obj != null)
{
    MethodInfo remove = obj.GetType()
        .GetMethod("Remove", BindingFlags.NonPublic | BindingFlags.Instance, 
            Type.DefaultBinder, new Type[] { typeof(string) }, null);

    object proc = remove.Invoke(obj, new object[] { "j" + state.SessionID });
}

Das Endergebnis ist, dass die nächste Anforderung auf dem gleichen SessionID nehmen, aber die Httpsessionstate leer. Sie werden immer noch die Session_Start und Session_End Veranstaltungen.

Mit InProc Session, werden Sie nicht in der Lage sein, auf die Daten zuzugreifen ... Mit State, werden Sie noch ein klebriges Szenario die Sitzung zu entfernen, haben versucht, die richtige API zugreifen zu können.

Sie werden wahrscheinlich wollen eine Datenbank gesichert Staaten-Lösung wie die abgepackte SqlServer Zustand Anbieter oder einem Dritten Lösung wie DOTSS verwenden: http://codeplex.com/dotss

Mit der Datenbank gesichert Lösung, können Sie den Zustand Datensatz in einer Tabelle zum Nachschlagen von Session-ID und markieren Sie ihn als abgeschlossen. Diese Techniken variieren je nach Anbieter Sie wählen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top