2008-12-18 6 views
6

Je travaille sur un projet où j'ai besoin de ce qui suit.Nom d'utilisateur WCF sans certificat

  • service WCF sur le côté serveur (.NET 3.5)
  • WPF pour le côté client (.NET 3.0)

j'ai une application existante que je dois utiliser l'authentification et autorisation de (côté serveur). J'ai également besoin de stocker des métadonnées sur l'utilisateur dans le thread principal du service WCF (un objet site). Je fais cela pour que je puisse y accéder dans le service de la WCF si je dois absolument; une certaine logique métier peut l'exiger. Donc, mon plan était de faire ce qui suit ...

Créez un ServiceAuthorizationManager personnalisé pour le serveur et là je vais connecter l'utilisateur et obtenir les rôles de l'application existante. Je mettrai en cache l'objet "Site" et, une fois de plus, je retirerai le cache. J'ai également besoin d'un objet CustomPrincipal pour stocker mes données personnalisées. Je veux usurper l'identité de l'utilisateur afin que je puisse utiliser les rôles builtin filtrage dans WCF comme ceci:

[PrincipalPermission(SecurityAction.Demand, Role = "Role1")] 
public string[] RolesForUser(string username){} 

J'ai essayé d'utiliser l'autorisation d'ASP.NET avec un fournisseur de rôles personnalisés, mais je n'ai pas pu mettre quoi que ce soit sur le Principal actuel. J'ai également tenté d'utiliser une IAuthorizationPolicy personnalisée, mais des problèmes sont survenus. Ces problèmes concernaient la possibilité d'utiliser l'application WCFClient.exe, quand elle découvrait (en utilisant le mex endpoing) elle ne donnerait aucune information d'identification, donc la connexion échouerait. J'ai finalement décidé qu'un ServiceAuthorizationManager était la bonne voie à suivre, mais je suis ouvert à d'autres suggestions.

Sur le client, je rassemble les informations d'identification et les place dans la classe proxy WCF, comme suit.

proxy.ChannelFactory.Credentials.UserName.UserName = userName; 
proxy.ChannelFactory.Credentials.UserName.Password = password; 

Comme je l'ai commencé à aller dans cette voie, je remarquais que je n'ai pas pu obtenir le nom d'utilisateur/mot de passe dans la méthode CheckAccessCore de ma classe de gestionnaire. Une enquête plus poussée a montré que je devrais vraiment m'authentifier dans un UserNamePasswordValidator personnalisé. Alors j'en ai créé un. Le problème est que la méthode validate n'a jamais été appelée.

Une enquête supplémentaire a montré que pour que la méthode de validation soit appelée, mon service WCF doit avoir un message ou une sécurité au niveau du transport. Le problème avec cela est que je ne peux pas comprendre comment avoir un message ou une sécurité de niveau de transport sans certificat X.509. Ce produit va dans plusieurs centaines de machines incroyablement verrouillées, et l'installation d'un certificat n'est pas possible.

Existe-t-il un moyen de faire ce que je demande sans installer un certificat?

Répondre

6

Réponse courte; tu ne peux pas. Dès que vous utilisez un nom d'utilisateur/mot de passe, vous avez besoin d'une sorte de chaîne sécurisée.

Cependant, vous n'avez pas besoin de certificats sur les clients; seulement sur le serveur.

22

En fait, c'est possible, mais vous devrez implémenter votre propre reliure.

Yaron Naveh a développé une liaison WCF qui permet un nom d'utilisateur/mot de passe en texte clair via HTTP. Son article inclut le code pour la liaison.

1

Je ne connais pas les détails de votre infrastructure réseau, mais si vous êtes dans un domaine Windows, vous devez envisager d'utiliser les informations d'identification Windows.

Il est possible d'utiliser une sécurité de message sans certificats si vous utilisez des informations d'identification Windows. C'est le comportement par défaut de wsHttpBinding (out of the box). En utilisant les solutions prêtes à l'emploi (sans implémenter votre propre liaison) WCF vous encourage (vous oblige) à utiliser un canal sécurisé chaque fois que des informations d'authentification sont incluses dans les messages. L'utilisation d'une liaison personnalisée qui vous permet de spécifier des informations d'identification en texte clair est sûrement une solution, mais j'y réfléchirais à deux fois avant de l'utiliser.

Questions connexes