Itérer à travers des objets Session existants
-
06-07-2019 - |
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?
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.