web-dev-qa-db-fra.com

Une seule connexion simultanée par utilisateur dans Asp.net

est-il possible d'autoriser une seule connexion simultanée par utilisateur dans l'application Web Asp.Net? 

Je travaille sur une application Web dans laquelle je veux m'assurer que ce site Web n'autorise qu'un seul login par utilisateur à la fois. Comment vérifier que l'utilisateur actuel est déjà connecté ou non. 

suggère la méthode de connexion appropriée par laquelle nous pouvons traiter ce problème. Je pense que nous devrions utiliser l’état de session du serveur SQL pour traiter ce problème. que suggérez-vous?

Je pensais une solution pour cela. Je ne sais pas si c'est approprié ou non. nous pouvons faire quelque chose comme:

  1. Lorsque l'utilisateur se connecte au système, on insère l'identifiant de session dans la colonne utilisateur. (Nous utiliserons une session de base de données pour pouvoir obtenir facilement toutes les données relatives à la session, telles que isexpired, expiredatetime, etc.).

  2. Lorsque le même utilisateur essaie de se connecter une deuxième fois, nous vérifierons si cette colonne d'identifiant de session et si cette session a déjà expiré. si la session n'a pas expiré, nous ne permettrons pas à l'utilisateur de se connecter. 

  3. Mettre à jour l'ID de session de l'utilisateur chaque fois que l'utilisateur se déconnecte.

S'il vous plaît suggérer cette manière appropriée ou non. 

11
Hiren Dhaduk

Prière de se référer à:

Lorsque le même ID utilisateur tente de se connecter sur plusieurs périphériques, comment puis-je tuer la session sur l'autre périphérique?

Par défaut, .NET ne prend pas cela en charge. .NET permet des connexions simultanées, comme vous le savez sans doute.

J'avais exactement les mêmes exigences et j'ai mis au point une solution plutôt astucieuse, illustrée dans le lien ci-dessus. En un mot, mon exigence était de n’avoir qu’un seul compte utilisateur à la fois. Si ce même ID utilisateur essayait de se connecter ailleurs, il supprimait la session lors de la première connexion en recherchant une connexion existante sous un ID de session différent (cela permettait à l'ID utilisateur d'être connecté à partir de plusieurs instances de son ordinateur). navigateur Web sur leur ordinateur [même identifiant de session], ce qui est courant, mais pas à partir d'un autre ordinateur [identifiant de session différent] (peut-être dû à une personne qui a volé leurs informations d'identification, par exemple)). En modifiant le code, vous pouvez probablement en modifier le comportement, c’est-à-dire empêcher la deuxième tentative de connexion au lieu de supprimer la première connexion déjà active et en cours d’utilisation.

Bien sûr, il ne correspond peut-être pas à 100% à vos besoins, alors n'hésitez pas à le modifier pour l'adapter à vos besoins.

9
Mike Marks

Vous pouvez créer une entrée de cache par utilisateur et y stocker son identifiant de session. L'identifiant de session sera unique par session de navigateur. Dans votre page de connexion, vous pouvez créer cette entrée de cache une fois la connexion établie:

if(Cache.ContainsKey["Login_" + username])
    // Handle "Another session exists" case here
else
    Cache.Add("Login_" + username, this.Session.SessionID);

(Code saisi dans la zone de texte sans vérification de la syntaxe. Supposez "pseudo-code".)

Dans global.asax, vous pouvez ensuite vous connecter à Session_End et faire expirer cette entrée de cache de l'utilisateur. Voir ceci pour les événements global.asax.

if(Cache.ContainsKey["Login_" + username])
    Cache.Remove("Login_" + username);
5
Tombala

Vous pouvez ajouter une colonne d'indicateur dans la table des utilisateurs indiquant qu'un utilisateur est actuellement connecté. 

Lorsqu'un utilisateur tente de se connecter, vous cochez l'indicateur s'il est vrai (le compte de l'utilisateur est déjà utilisé), vous n'autorisez pas le nouvel utilisateur à se connecter. Si l'indicateur est false, les utilisateurs sont autorisés à se connecter car il y a le compte n’est utilisé par personne d’autre à ce moment.

Sachez cependant que, sauf si l'utilisateur se déconnecte activement, vous ne pouvez pas savoir quand les utilisateurs passent à autre chose (accédez à un autre site Web ou ferme le navigateur, etc.). Vous devez donc définir un type de délai d'expiration de session qui se déconnectera automatiquement. l'utilisateur s'il n'y a pas de nouvelles demandes dans un délai spécifié. 

Cela signifie que si un utilisateur ferme son navigateur et tente de se connecter à un appareil mobile, par exemple, il ne pourra pas se connecter avant l'expiration du délai de session spécifié. Par conséquent, réfléchissez un peu au délai d'expiration. ne voulez pas que l'utilisateur se déconnecte trop rapidement (s'il lit une longue page, etc.) et vous ne voulez pas que les utilisateurs ne puissent pas se connecter à un autre appareil pendant des heures s'il a oublié se déconnecter avant de quitter la maison.

2
Markus-ipse

Si vous utilisez un système d’identité, ce lien vous aidera à vous identifier en tant qu’utilisateur unique sur plusieurs appareils . Empêcher l’ouverture de plusieurs connexions dans Asp.Net Identity Projet.

1
Hamza Shafiq

Les identifiants de connexion sont stockés dans le cookie. Par conséquent, pour savoir si l'utilisateur est connecté, vous devez conserver ces informations sur le serveur, de préférence dans une base de données, car cette base de données peut être le seul endroit commun entre les jardins ou les fermes Web .

Ce que vous pouvez conserver est sur une table, que le user A est connecté ou non, marquez-le qui est déconnecté, peut-être que la dernière interaction utilisateur aura un délai d'expiration, etc.

Alors, disons que l'utilisateur A est connecté, puis vous ouvrez un indicateur sur la base de données de cet utilisateur, qui est maintenant connecté, et si vous essayez de vous reconnecter, vous l'empêchez d'entrer . vous devez dire à vos utilisateurs de se déconnecter ou de conserver un délai d'expiration, similaire au délai d'expiration des informations d'identification.

1
Aristos