Posso abbandonare una sessione ASP.NET InProc da una sessione diversa da quella che effettua la richiesta?

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

Domanda

Abbiamo un'applicazione che esegue il single sign-on utilizzando un server di autenticazione centralizzata (CAS). Vorremmo eseguire la disconnessione singola, in modo tale che se l'utente si disconnette da un'applicazione (ad esempio un portale front-end), l'utente viene automaticamente disconnesso da tutte le applicazioni utilizzando lo stesso ticket di accesso singolo.

L'aspettativa sarebbe che ogni applicazione registrasse un hook di disconnessione (URL) con il CAS al momento dell'accesso a quell'applicazione. Quando il CAS riceve la richiesta di disconnessione da una delle applicazioni, richiama il hook di disconnessione per tutte le applicazioni che condividono il ticket SSO.

La mia domanda è questa: c'è un modo per abbandonare una sessione InProc da una sessione diversa? Presumo, poiché la richiesta HTTP verrà dal server CAS, che otterrà la propria sessione, ma è la sessione dell'utente che voglio terminare. Ho una buona idea di come farlo utilizzando un server dello stato della sessione separato, ma vorrei sapere se è possibile utilizzare lo stato della sessione InProc.

È stato utile?

Soluzione 2

Dopo aver fatto un po 'di ricerche e considerando le risposte fornite finora, ho trovato un'alternativa che mi consente di continuare a utilizzare la sessione InProc. Fondamentalmente, consiste nell'estensione di HttpModule che gestisce già il single sign-on ai rilevamenti di CAS rilevati e reindirizza il browser alla pagina di disconnessione dell'applicazione.

Outline:

Sign-On:

  1. Per ogni nuova richiesta Single Sign-On, creare un nuovo cookie SSO e codificare un valore univoco in esso per identificare la sessione (non l'id di sessione, quindi non è trapelato).
  2. Costruisci l'URL di richiamata di disconnessione, codificato con l'identificatore e registralo con il server CAS.

Sign-out:

  1. Quando viene ricevuta una richiesta di disconnessione dal server CAS, decodificare l'identificatore e memorizzarlo in una cache a livello di applicazione. Questo deve essere bloccato nella cache almeno per il tempo necessario affinché la sessione scada in modo naturale.
  2. Per ogni richiesta, cerca il cookie SSO e verificane il valore rispetto agli identificatori di sessione memorizzati nella cache. Se si verifica un hit, rimuovi il cookie SSO e reindirizza il browser all'URL di disconnessione dell'applicazione.
  3. Per ogni disconnessione, verificare se esiste un cookie SSO, in tal caso, inoltrare la richiesta di disconnessione al CAS. In ogni caso, abbandonare la sessione dell'utente e disconnetterlo dall'applicazione.

Page Load:

  1. Verifica la presenza del cookie SSO. Se non ce n'è uno, reindirizza alla pagina di disconnessione.

Altri suggerimenti

Haha, beh ... sembra che tu possa. Mi chiedevo se ci fosse un modo per farlo, si scopre, c'è.

Quando si utilizza InProc, InProcSessionStateStore (classe interna) mantiene lo stato della sessione in una cache interna (non pubblica). Puoi accedere a questa cache tramite reflection e rimuovere manualmente lo stato della sessione.

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 });
}

Il risultato finale è che la richiesta successiva assumerà lo stesso SessionID, ma HttpSessionState sarà vuoto. Riceverai comunque gli eventi Session_Start e Session_End.

Con InProc SessionState, non sarai in grado di accedere ai dati ... Con StateServer, avrai comunque uno scenario difficile che tenta di accedere all'API corretta per rimuovere la sessione.

Probabilmente vorrai utilizzare una soluzione di stato supportata dal database come il provider di stato SqlServer preconfezionato o una soluzione di terze parti come DOTSS: http://codeplex.com/dotss

Con la soluzione di backup del database, sarà possibile cercare il record di stato in una tabella per ID sessione e contrassegnarlo come completato. Queste tecniche variano in base al provider scelto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top