2009-01-08 7 views
1

HI, Je fais la solution ERP dans l'application Windows C# (2.0) et la base de données SQL2005.L'application réseau communique via Database.J'ai utilisé une technique normale pour la connexion et la déconnexion des utilisateurs, en conservant un bit d'état. Mon problème est que lorsque mon application est interrompue pour une raison quelconque, le statut de l'utilisateur peut ne pas changer. L'utilisateur ne peut pas se connecter à la prochaine fois. Comment puis-je résoudre ce problème? Pourriez-vous donner une nouvelle technique pour la manipulation de l'utilisateur?Connexion d'utilisateur technique C# Win App

Répondre

1

Si votre intention est d'autoriser le partage d'un nom d'utilisateur sur des ordinateurs différents, après la connexion avec mot de passe valide, connectez-le jeton unique sur cet ordinateur pour staff.last_logged_at = @unique_token. Lors de la déconnexion, définissez staff.last_logged_at = ''. De cette façon, même si l'ordinateur a été interrompu (panne du programme due à un virus ou appui accidentel sur le bouton de réinitialisation de l'ordinateur, etc, last_logged_at n'a pas été réinitialisé), l'utilisateur peut toujours se connecter, il suffit de vérifier si le ordinateur sur lequel l'utilisateur se connecte actuellement est identique à last_logged_at. Si c'est pareil, il/elle peut toujours se connecter.



Si certains utilisateurs a essayé de vous connecter en utilisant le nom d'utilisateur d'un autre utilisateur, il suffit de vérifier si le jeton de la machine de l'ordinateur de certains utilisateurs est la même chose avec si elle ne correspond pas la last_logged_at de l'autre utilisateur,, n'autorise pas vous connecter, cela signifie que deux utilisateurs partagent le même mot de passe.



Maintenant, le scénario si l'ordinateur tombe en panne vraiment dur (processeur fond, crash de disque dur, OS a besoin de réinstaller, etc.). L'utilisateur doit être autorisé à utiliser d'autres ordinateurs. Créez un module administratif qui peut réinitialiser last_logged_at de l'utilisateur.



Pour @unique_token, il suffit d'utiliser tout ce qui est unique et permanent sur un ordinateur, disons que l'adresse MAC, ou quoi que ce soit sur les paramètres hacher OS.



code pseudo:

Logging In: 

if (select count(*) from staff where staff_name = @staff_name and password = 'correct' and (last_logged_at = '' or last_logged_at = @unique_token)) <> 0 then then 

    -- allow login   
    update staff set last_logged_at = @unique_token where staff_name = @staff_name 



else if (select count(*) from staff where staff_name = @staff_name and password = 'correct' and last_logged_at <> @unique_token) <> 0 then then 

    -- disallow login 
    throw exception "You cannot use the same user name on two or more computers. Contact the administrator if you have any concerns" 

else 

    -- disallow login 
    throw exception "Wrong password" 

end if 


Logging Out: 

update staff set last_logged_at = '' where staff_name = @staff_name 
+0

Cette application ne doit pas permettre à l'utilisateur de se connecter n'importe où dans le réseau qui est déjà connecté même dans la même machine.SO comment puis-je modifier le code pour faciliter les exigences. – Anoop

+0

Dans mes services bancaires en ligne, si je ferme le site sans me déconnecter, cela ne me permettra pas de me reconnecter pendant 20 minutes. Après cela, je peux me connecter à nouveau joyeusement. Mais si vous voulez faciliter la connexion même si l'utilisateur ne s'est pas déconnecté correctement, il suffit de créer un module administratif pour réinitialiser l'état de connexion. –

+0

.. alors laissez l'utilisateur contacter le DBA pour passer outre les choses –

2

Que diriez-vous de suivre les connexions des utilisateurs en maintenant une session pour chaque connexion? La solution rapide-et-sale est alors d'offrir une option pour les faire se connecter à partir d'un "nouvel emplacement" et invalider l'ancienne session. Ensuite, lorsque vous allez effectuer une opération, vérifiez d'abord si la session est toujours valide. La meilleure implémentation consiste à maintenir la session active et à spécifier un délai d'expiration. (c'est-à-dire si la session est âgée de x minutes, l'invalider.) Ensuite, vous ne verrez pas de "connexions fantômes" provenant des anciennes connexions orphelines - elles expireront automatiquement.

+0

que je fais l'application Windows ne application Web. – Anoop

+0

@Anoop: Une session n'est pas spécifique au Web. Un utilisateur se connectant à Windows peut également s'appeler une session. – GvS

+0

Pourriez-vous me donner plus d'idée ou un lien sur la session? Je n'ai pas vraiment d'idée à ce sujet. – Anoop

1

Il y a deux réponses communes ici:

  • si vous essayez de vous connecter, et êtes déjà connecté, offrir à casser (reset) la connexion existante
  • utiliser un vote/délai d'attente - à savoir que l'application appelle une méthode toutes les 2 minutes (par exemple) qui met à jour un "dernier reçu de"; si vous n'avez pas eu de nouvelles de quelqu'un en 5 minutes (par exemple), effacez le drapeau
+0

Merci ... J'ai eu votre idée. Mais le contrôle continu va-t-il ralentir mon application? La base de données placée dans net.Hop vous avez plus d'idée à ce sujet. – Anoop

+0

Cela dépend du nombre d'utilisateurs; 1 coup par utilisateur toutes les 2 minutes, et un balayage rapide (ranger) toutes les quelques minutes, est souvent bien; si ce n'est pas le cas, n'utilisez pas l'interrogation - utilisez simplement la première option. –

+0

Merci beaucoup. Je vais suivre ça. – Anoop

0

Pourquoi limiter le nombre de fois qu'un utilisateur peut se connecter? Sous Windows, il est courant de démarrer plusieurs instances d'une application.

Je dois admettre, je mon application Windows il y a aussi une partie seulement un utilisateur est autorisé. Pour voir si d'autres utilisateurs sont connectés, j'utilise quelque chose comme l'algorithme d'interrogation de Marc. Avec une option pour forcer l'entrée.

Une mise à jour de l'enregistrement de verrouillage une fois par minute ou deux minutes n'est pas très gourmande en ressources (sauf si vous avez des milliers d'utilisateurs).

+0

Merci ... J'ai eu cette idée.Je n'ai pas beaucoup d'utilisateur, donc je peux utiliser la technique d'interrogation. – Anoop