2010-09-07 2 views
1

Aujourd'hui, j'ai implémenté un fournisseur d'authentification personnalisé pour mon service WCF. Il est capable de déterminer si mon utilisateur est valide ou non, comme prévu.Récupération de l'utilisateur actuellement authentifié dans un service WCF

Donc, maintenant j'ai cette classe:

public class MyCustomValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string userName, string password) 
    { 
     User apiUser = User.Login(userName, password); 

     // other logic goes here. 
    } 
} 

Le comportement de ma demande dépend de quels objets l'utilisateur peut accéder. Alors, comment puis-je obtenir mon objet Utilisateur d'ici à ma classe de service? Il n'y a pas de moyen immédiatement évident que je peux voir, car ma classe de service n'hérite pas de n'importe quoi par défaut, contrairement aux contrôleurs ASP.NET. Mon premier instinct est de configurer un paramètre statique dans MyCustomValidator, puis de le lire à partir de là, mais je suspecte qu'une condition de concurrence puisse se produire. Quelqu'un peut-il confirmer ou infirmer mes soupçons? Et le plus important: Y at-il une meilleure façon de le faire? C'est la première fois que j'utilise la WCF, donc je ne suis pas au courant des meilleures pratiques impliquées ici.

Nous vous remercions de votre temps.

+1

Votre validateur est certainement mal car il nécessite un accès au mot de passe en texte clair de l'utilisateur. La grande majorité des schémas d'authentification (Digest, NTLM, Kerberos, OAuth) ne passent jamais le mot de passe en clair, ils établissent la propriété du mot de passe via des défis et des réponses de digestion (ie via des hachages). –

Répondre

1

Vous souhaitez transmettre des données du validateur à l'instance de service. C'est mauvais parce que vous ne pouvez pas le faire. UserNamePasswordValidator sert uniquement à valider les informations d'identification (nom d'utilisateur et mot de passe). Vous n'avez accès à rien de votre validateur. Il ne voit même pas le contexte d'opération actuel car il s'exécute dans un thread différent. L'utilisation d'un paramètre statique n'est pas une sloution - comme vous l'avez mentionné, c'est une condition de concurrence.

Je pense que vous devez mettre en œuvre l'autorisation et l'authentification personnalisée et il est pas facile: WCF Authorizaton, Custom Authorization, Custom credentials and validation

+0

Merci beaucoup pour ces mots clés. Je crois que je suis maintenant sur la bonne voie pour résoudre ce problème. J'espère répondre complètement à cette question plus tard aujourd'hui, et je posterai ma réponse ici. –

Questions connexes