3 Stimmen

Kann ich eine InProc ASP.NET-Sitzung von einer anderen Sitzung aus als der, die die Anfrage stellt, abbrechen?

Wir haben eine Anwendung, die Single Sign-On mit einem zentralisierten Authentifizierungsserver (CAS) durchführt. Wir möchten Single Sign-Out durchführen, so dass der Benutzer, wenn er sich bei einer Anwendung (z. B. einem Front-End-Portal) abmeldet, automatisch bei allen Anwendungen mit demselben Single Sign-On-Ticket abgemeldet wird.

Die Erwartung wäre, dass jede Anwendung zum Zeitpunkt der Anmeldung bei dieser Anwendung einen Abmeldehaken (URL) beim CAS registriert. Wenn das CAS die Abmeldeanforderung von einer der Anwendungen erhält, ruft es den Abmelde-Hook für alle Anwendungen auf, die das SSO-Ticket gemeinsam nutzen.

Meine Frage ist folgende: Gibt es eine Möglichkeit, eine InProc-Sitzung von einer anderen Sitzung aus zu beenden? Da die HTTP-Anfrage vom CAS-Server kommt, nehme ich an, dass er seine eigene Sitzung erhält, aber es ist die Sitzung des Benutzers, die ich beenden möchte. Ich habe eine ziemlich gute Vorstellung davon, wie man dies mit einem separaten Sitzungszustandsserver bewerkstelligen kann, aber ich würde gerne wissen, ob dies mit dem InProc-Sitzungszustand möglich ist.

3voto

John Leidegren Punkte 57871

Haha, nun... Es sieht so aus, als ob du das kannst. Ich habe mich selbst gefragt, ob es eine Möglichkeit gibt, dies zu tun, und es stellte sich heraus, dass es eine gibt.

Wenn Sie InProc verwenden, hält der InProcSessionStateStore (interne Klasse) den Sitzungsstatus in einem internen (nicht öffentlichen) Cache fest. Sie können auf diesen Cache über Reflection zugreifen und den Sitzungsstatus 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 Anfrage dieselbe SessionID annimmt, aber der HttpSessionState leer ist. Sie erhalten weiterhin die Ereignisse Session_Start und Session_End.

0 Stimmen

Wird diese Arbeit für Sitzungszustand nicht inproc gespeichert?? wenn nicht, was ist der beste Weg, dies für NON InProc-Szenario zu tun?

0 Stimmen

@rbg Nun, an dieser Stelle gehe ich davon aus, dass Sie Ihren eigenen Sitzungsstatus-Anbieter bereitstellen, wenn nicht, dann hängt alles davon ab, wer den Sitzungsstatus-Speicher bereitstellt. Die Lösung hängt davon ab, welchen Session State Provider du verwendest.

0 Stimmen

Ich verwende den AppFabric Caching Service als Distributed Caching Server für den verteilten Sitzungsstatus. Ich verwende Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache für den Sitzungsstatusanbieter

2voto

tvanfosson Punkte 506878

Nachdem ich mich ein wenig umgesehen und die bisherigen Antworten berücksichtigt habe, bin ich auf eine Alternative gestoßen, mit der ich die InProc-Sitzung weiterhin nutzen kann. Im Grunde besteht es aus der Erweiterung des HttpModuls, das bereits Single Sign-On behandelt, um CAS-Sign-Outs zu erkennen und den Browser auf die Abmeldeseite der Anwendung umzuleiten.

Umriss:

Anmeldung:

  1. Erstellen Sie für jede neue Single-Sign-On-Anfrage ein neues SSO-Cookie und kodieren Sie darin einen eindeutigen Wert, um die Sitzung zu identifizieren (nicht die Sitzungs-ID, damit sie nicht durchgesickert ist).
  2. Konstruieren Sie die Abmelde-Callback-Url, verschlüsselt mit der Kennung, und registrieren Sie sie beim CAS-Server.

Abmeldung:

  1. Wenn eine Abmeldeanforderung vom CAS-Server eingeht, dekodieren Sie die Kennung und speichern sie in einem anwendungsweiten Cache. Sie muss mindestens so lange im Cache verbleiben, bis die Sitzung auf natürliche Weise abläuft.
  2. Suchen Sie bei jeder Anfrage nach dem SSO-Cookie und vergleichen Sie dessen Wert mit den zwischengespeicherten, abgemeldeten Sitzungskennungen. Wenn es einen Treffer gibt, entfernen Sie das SSO-Cookie und leiten Sie den Browser zur Abmelde-URL der Anwendung um.
  3. Prüfen Sie bei jeder Abmeldung, ob ein SSO-Cookie vorhanden ist, und wenn ja, leiten Sie die Abmeldeanfrage an das CAS weiter. Beenden Sie in jedem Fall die Sitzung des Benutzers und melden Sie ihn von der Anwendung ab.

Page_Load:

  1. Prüfen Sie, ob das SSO-Cookie vorhanden ist. Ist dies nicht der Fall, leiten Sie zur Abmeldeseite weiter.

1voto

x0n Punkte 49409

1voto

Jeff Fritz Punkte 9715

Mit InProc SessionState werden Sie nicht auf die Daten zugreifen können... Mit StateServer werden Sie immer noch ein schwieriges Szenario haben, wenn Sie versuchen, auf die richtige API zuzugreifen, um die Sitzung zu entfernen.

Sie werden höchstwahrscheinlich eine datenbankgestützte Zustandslösung wie den vorgefertigten SqlServer-Zustandsanbieter oder eine Drittanbieterlösung wie DOTSS verwenden wollen: http://codeplex.com/dotss

Mit der datenbankgestützten Lösung können Sie den Zustandsdatensatz in einer Tabelle anhand der Sitzungsnummer nachschlagen und als abgeschlossen markieren. Diese Techniken variieren je nach dem von Ihnen gewählten Anbieter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X