Scorrere gli oggetti Session esistenti
-
06-07-2019 - |
Domanda
Voglio essere in grado di eliminare le sessioni esistenti con lo stesso nome utente quando qualcuno accede per impedire a più persone di utilizzare lo stesso accesso.
C'è un modo per scorrere le sessioni esistenti e ucciderle?
Soluzione
Aggiungi questo al tuo global.asax
protected void Application_Start(object sender, EventArgs e)
{
Application["sessions"] = new List<HttpSessionState>();
}
protected void Session_Start(object sender, EventArgs e)
{
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Add(this.Session);
}
protected void Session_End(object sender, EventArgs e)
{
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Remove(this.Session);
}
Ora puoi scorrere le sessioni in questo modo
var sessions = (List<HttpSessionState>)Application["sessions"];
foreach (var session in sessions)
...
Al fine di uccidere altre sessioni, è possibile controllare il metodo Session_Start
per la vecchia sessione abbandonarlo. Potrebbe assomigliare a questo.
protected void Session_Start(object sender, EventArgs e)
{
var userId = (int)this.Session["userId"];
foreach (var session in sessions)
if ((int)session["userId"] == userId)
session.Abandon();
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Add(this.Session);
}
Altri suggerimenti
è possibile salvare gli utenti registrati nel database e verificare se hanno già effettuato l'accesso, è possibile impedire loro di accedere nuovamente. utilizzando il metodo Session_Start in Global.asax.
Risposta breve: no.
Risposta lunga: è necessario implementare il proprio provider di sessioni. Per una sessione non è possibile fare riferimento a un'altra sessione, per motivi di sicurezza. Dovresti andare in giro e implementare la tua gestione della sessione.
Una volta che l'ho implementato, ho archiviato gli ID utente (o qualcosa di unico) in una variabile dell'applicazione, un dizionario o un array. È facile verificare l'esistenza dell'ID utente nel Dizionario dell'applicazione al momento dell'accesso. L'unico vero problema sono le persone che non si disconnettono e chiudono semplicemente il browser. Non troverai mai un buon modo affidabile per rilevare questo evento.
Fuori dal bracciale:
Su Session_Start (in genere un accesso riuscito), archivia UserID e SessionID dell'utente in una tabella di ricerca (o nuova colonna nella tabella degli utenti).
Su ogni richiesta è necessario convalidare che UserID (memorizzato in Session) e SessionID corrispondano ai valori memorizzati nella tabella di ricerca come passaggio di autenticazione.