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?

È stato utile?

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.

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