3 votes

Comment autoriser une seule session par utilisateur

On m'a confié la tâche de limiter les utilisations multiples et simultanées d'une application Silverlight pour un seul utilisateur. Idéalement, chaque fois que l'utilisateur ouvre une nouvelle application, l'instance précédente devrait recevoir une sorte de notification et se fermer.

L'application Silverlight consomme des données en utilisant des services WCF exposés via un point de terminaison REST. Actuellement, chaque appel au service a pour paramètres le nom d'utilisateur et le mot de passe. C'était bien parce que nous avions des services sans état. Il y a des applications qui utilisent déjà ces services et je cherche la solution la moins pénible.

Gracias

2voto

stralsi Points 848

Ok, je me suis précipité pour répondre parce que j'ai mal compris la question. J'ai d'abord pensé que vous faisiez référence à des instances sur le même ordinateur.

Pour empêcher la présence de plusieurs instances sur le même ordinateur vous pouvez utiliser le Classe LocalMessageReceiver .

Vous pouvez voir un exemple de code aquí qui vous montre comment empêcher l'utilisateur d'ouvrir une deuxième instance de l'application. Chaque LocalMessageReceiver doit avoir un nom de canal unique comme paramètre du constructeur. Si le constructeur lève une exception, vous pouvez supposer qu'il existe une autre instance de l'application.

Si vous souhaitez conserver uniquement la dernière instance de l'application et fermer les précédentes, vous devez alors créer des noms de canaux uniques pour chaque instance, puis envoyer un message pour indiquer aux autres instances de se fermer.

Pour empêcher les instances multiples de l'application sur différents ordinateurs Je suis moins qualifié pour répondre, mais la première chose qui me vient à l'esprit est d'écrire dans la base de données chaque fois qu'un utilisateur se connecte .

Si vos services ne doivent pas nécessairement rester sans état, vous pouvez conserver dans une table de base de données un identifiant unique pour chaque fois qu'un utilisateur se connecte (ex : la date de connexion ?), et ensuite, chaque fois que l'utilisateur veut faire une action, vous pouvez vérifier si le dernier identifiant de la base de données correspond à celui que vous avez dans la session actuelle. Si ce n'est pas le cas, cela signifie que quelqu'un s'est connecté avec le même utilisateur depuis un autre ordinateur, et vous pouvez donc faire expirer la session.

1voto

Joel Etherton Points 24155

Étant donné que Silverlight n'est pas une application sans état, vous devriez être en mesure d'implémenter cette fonction avec un service simple et un système de gestion des données. HMAC . Si vous avez déjà les noms d'utilisateur et/ou les identifiants dans votre base de données, il devrait être facile d'ajouter une table unique avec comme clé l'identifiant de l'utilisateur qui contient des informations d'horodatage et un HMAC spécifique pour un login particulier. Ce HMAC serait généré à partir de quelque chose de spécifique sur la machine en conjonction avec l'horodatage qu'il a été généré. Quelque chose comme :

userGuid | activeHMAC | lastLoginDate | currentlyLoggedIn (bit)

Ensuite, lors de l'action de connexion du contrôle Silverlight, un enregistrement pour le userGuid peut être ajouté ou mis à jour pour inclure les informations actuelles. Cela obligerait toutes les nouvelles connexions à écraser les HMACs de connexion existants. Ensuite, lors d'un événement de déconnexion ou de fermeture, il suffit d'appeler le service et de définir l'attribut currentlyLoggedIn à faux.

Il faudrait alors s'assurer que ce HMAC est envoyé avec toutes les communications vers un service Web afin qu'il puisse être vérifié par rapport aux nouveaux appels ou que chaque client appelle périodiquement le service pour comparer le HMAC et désactiver le client si la comparaison échoue. Comme Silverlight fonctionne de manière déconnectée, votre choix serait probablement régi par l'intégrité des données. Personnellement, je pense qu'il serait plus sûr d'intégrer le HMAC dans toutes les communications afin d'éviter qu'un quelconque décalage ne permette des actions inappropriées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X