2010-08-24 9 views
0

J'utilise un UserNamePasswordValidator personnalisé, qui instancie et se connecte à notre API interne. Cette API expose un événement déclenché lorsque l'utilisateur est "kické" (par un autre utilisateur administratif), et j'aimerais y répondre en supprimant la session WCF, de sorte que d'autres appels lèvent une exception.Avec UserNamePasswordValidator personnalisé, puis-je supprimer la «session» WPF de l'utilisateur?

Comment procéder?

Mon service WCF est hébergé dans un service Windows (pas IIS). Instancier et se connecter à l'API interne prend beaucoup de temps, donc je ne peux pas le faire à chaque appel de service.

Répondre

0

Je trouve un code à http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx qui montre comment utiliser une classe et, de là, en passant les détails de l'utilisateur sur toute la mesure ServiceCredentials jusqu'à Thread.CurrentPrinciple. À partir de ce code, j'ai stocké l'objet Connection dans un objet principal personnalisé, ce qui signifie que je peux y accéder dans un contexte de session. Ensuite, j'ai ajouté un CodeAccessSecurityAttribute personnalisé qui vérifie cet objet de connexion pour voir s'il a été déconnecté. Si c'est le cas, une exception est levée, ce qui tue la session de l'utilisateur.

0

Si vous pensez que le service authentifiera chaque appel utilisateur avec un nom d'utilisateur et un mot de passe, vous pouvez avoir n'importe quel code dans votre validateur. Mais si vous prévoyez utiliser l'instanciation par service de session, vous utiliserez probablement également le contexte de sécurité (session de sécurité). Dans ce cas, seule la première requête est authentifiée par le validateur et la requête suivante est authentifiée par le jeton généré lors de l'établissement du contexte de sécurité.

Edit:

Chaque service en cours d'exécution est représenté par classe InstanceContext. Si vous avez des services PerSession, InstanceContext est le même pour chaque appel. Si vous stockez une référence à InstanceContext quelque part, vous devriez être capable de libérer l'instance et fermer la session - je n'ai jamais essayé mais cela devrait être possible.

+0

J'utilise l'instanciation par session, car la connexion à notre API est coûteuse. Question reste: comment puis-je révoquer la session? –

+0

Quelle reliure utilisez-vous? L'instanciation PerSession dépend d'un autre type de session: transport, sécurité ou fiable. –

+0

Quelle que soit la liaison dont j'ai besoin: je contrôle le client et le serveur. –