Question

Je veux pouvoir supprimer les sessions existantes pour le même nom d'utilisateur lorsque quelqu'un se connecte pour empêcher plusieurs personnes d'utiliser le même identifiant.

Existe-t-il un moyen de parcourir les sessions existantes et de les tuer?

Était-ce utile?

La solution

Ajoutez ceci à votre 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);
}

Vous pouvez maintenant parcourir vos sessions comme ceci

var sessions = (List<HttpSessionState>)Application["sessions"];

foreach (var session in sessions)
       ...

Afin de tuer d'autres sessions, vous pouvez enregistrer la méthode Session_Start pour l'ancienne session et l'abandonner. Cela pourrait ressembler à quelque chose comme ça.

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

Autres conseils

vous pouvez enregistrer les utilisateurs connectés dans la base de données et vérifier s'ils se sont déjà connectés. Vous pouvez les empêcher de se reconnecter. en utilisant la méthode Session_Start sous Global.asax.

Réponse courte: non.

Réponse longue: vous devez implémenter votre propre fournisseur de session. Pour des raisons de sécurité, il est impossible pour une session de faire référence à une autre session. Vous devrez faire le tour et mettre en place votre propre gestion de session.

La seule fois où j'ai implémenté cela, j'ai stocké des identifiants d'utilisateur (ou quelque chose d'unique) dans une variable d'application, un dictionnaire ou un tableau. Il est facile de vérifier l'existence de l'ID utilisateur dans le dictionnaire d'applications au moment de la connexion. Le seul problème concerne les personnes qui ne se déconnectent pas et ne ferment pas le navigateur. Vous ne trouverez jamais un moyen fiable de détecter cet événement.

De la manchette:

Sur Session_Start (généralement une connexion réussie), stockez les ID utilisateur et SessionID de l'utilisateur dans une table de recherche (ou une nouvelle colonne dans la table utilisateur).

À chaque demande, vous devez valider que l'ID utilisateur (stocké dans la session) et le sessionID correspondent aux valeurs stockées dans la table de recherche en tant qu'étape d'authentification.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top