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?