J'ai créé un service de repos de WCF auto-hébergé (avec quelques extra de Kit de démarreur de WCF Repos Aperçu 2). Tout cela fonctionne bien. P>
J'essaie maintenant d'ajouter une authentification de base au service. Mais je frappe des barrages routiers plutôt gros dans la pile de WCF qui m'empêche de le faire. P>
Il semble que le Je peux obtenir l'authentification fonctionnant si j'oublie de ce Les services de repos doivent être accessibles aux ordinateurs et aux humains (au moins au moins sur le niveau de demande d'obtention). Par conséquent, je pense que le repos de la WCF ne respecte pas une partie fondamentale du repos ici. Est-ce que quelqu'un est d'accord avec moi? P>
Quelqu'un a-t-il une authentification de base travaillant avec un service de repos de WCF auto-hébergé? Si oui, comment l'avez-vous fait? P>
PS: Évidemment, mes intentions d'utiliser une authentification de base non sécurisée sont sur le principe que j'aurais aussi du travail HTTPS / SSL pour mon service. Mais c'est une autre affaire. P>
PPS: J'ai essayé WCF Repos apport ( http://wcfrescontrib.codeplex.com/ ) et cela a exactement le même problème. Il semble que cette bibliothèque n'a pas été testée dans des scénarios auto-hébergés. P>
merci. p> httplistener code> (quels services de WCF auto-hébergés utilisent en interne à un niveau bas dans la pile WCF) bloquent mes tentatives d'insérer un
www-authentifier code> En-tête sur un
401 non autorisé auto-généré code> réponse. Pourquoi? P>
www-authentifier code> en-tête (qu'il semble que Microsoft ait aussi fait). Mais c'est la question. Si je n'envoie pas de
www-authentifier code> en-tête, le navigateur Web ne affiche pas la boîte de dialogue "Logon" standard. L'utilisateur sera simplement confronté à une page d'erreur code> non autorisé code> sans aucun moyen de vous connecter réellement. P>
3 Réponses :
Malheureusement, j'ai déterminé (en analysant le code source de référence de la WCF et l'aide de l'outil Fiddler pour la session HTTP reniflant) selon lequel il s'agit d'un bogue dans la pile de WCF.
Utilisation de FIDDLER, j'ai remarqué que mon service WCF était Se comporter Contrairement à tout autre site Web utilisant l'authentification de base. P>
Pour être clair, c'est ce qui devrait arriver: P>
obtenir code> sans savoir qu'un mot de passe est même nécessaire. LI>
- Web Server rejette la demande avec un
401 non autorisé code> et inclut un www-authentifier code> en-tête contenant des informations sur des méthodes d'authentification acceptables. LI>
- Le navigateur invite l'utilisateur à entrer des informations d'identification. LI>
- Le navigateur renvoie
obtenir code> demande et inclut l'authentification appropriée code> en-tête avec les informations d'identification. LI>
- Si les informations d'identification étaient correctes, le serveur Web répond avec
200 OK code> et la page Web.
Si les informations d'identification ont eu tort, le serveur Web répond avec 401 non autorisé code> et inclut le même www-authentifier code> en-tête qu'il a fait à l'étape 2. LI>
ol> Qu'est-ce qui se passait réellement avec mon service WCF était ceci: p>
- Navigateur envoie
obtenir code> sans savoir qu'un mot de passe est même nécessaire. Li>
- Avis WCF Il n'y a pas d'authentification code> code> d'en-tête de la requête et rejette aveuglément la demande avec un statut code> non autorisé (code> non autorisé et inclut un
www-authentifier code> en-tête . Tout normal jusqu'à présent. Li>
- Navigateur invite l'utilisateur pour les informations d'identification. Toujours normal. Li>
- Le navigateur renvoie
obtenir code> demande, y compris l'authentification code> approprié code> en-tête. LI>
- Si les informations d'identification étaient correctes, le serveur Web répond avec
200 OK code>. Tout est bon.
Si les informations d'identification étaient mauvaises cependant, WCF répond avec 403 interdit code> et n'inclut pas d'en-têtes supplémentaires tels que www-authentifier code>. Li>.
ol> Lorsque le navigateur obtient le statut code> 403 interdit code> Il ne perçoit pas que cela soit une tentative d'authentification défaillante. Ce code d'état est destiné à informer le navigateur que l'URL qu'elle a essayé d'accéder est hors limites. Cela ne concerne aucune authentification. Cela a le terrible côté affectant que lorsque l'utilisateur tape mal que son nom d'utilisateur / mot de passe de manière incorrecte (et le serveur rejette avec 403), le navigateur Web ne reppompte pas l'utilisateur à saisir à nouveau leurs informations d'identification. En fait, le navigateur Web croit que l'authentification a réussi et stocke donc ces informations d'identification pour le reste de la session! P>
Dans cet esprit, j'ai recherché des éclaircissements: P>
Le RFC 2617 ( http://www.faqs.org/rfcs/rfc2617.html#ixzz0eboufnrl ) Ne mentionne nulle part l'utilisation du code d'état code> interdit code>. En fait, ce qu'il faut dire sur la question est le suivant: p>
Si le serveur d'origine ne souhaite pas
accepter les informations d'identification envoyées avec un
demande, il devrait renvoyer un 401
(Non autorisée) réponse. La réponse
Doit inclure un en-tête www-authentifier
champ contenant au moins un
Défi (éventuellement nouveau) applicable à
la ressource demandée. P>
BlockQuote>
WCF ne fait aucun de ces. Il n'envoie pas correctement un code d'état code> non autorisé code> non autorisé. Il n'inclut pas non plus un www-authentifier code> en-tête. P> MAINTENANT pour trouver le pistolet fumant dans le code source WCF: P>
J'ai découvert que dans le HTTPequestContext Code> La classe est une méthode appelée ProcessAuthentication code>, qui contient les éléments suivants (extrait): p> xxx pré> Je défends Microsoft sur beaucoup de choses, mais c'est indéfendable. P>
Heureusement, je l'ai eu de travailler à un niveau "acceptable". Cela signifie simplement que si l'utilisateur entre accidentellement dans son nom d'utilisateur / mot de passe de manière incorrecte, le seul moyen d'obtenir une autre tentative est de fermer complètement leur navigateur Web et de le redémarrer pour réessayer. Tous parce que WCF est pas em> répondant à la tentative d'authentification défaillante avec un 401 non autorisé code> et a www-authentifier code> en-tête selon la spécification. P > p>
@Serialseb Je n'avais pas le cœur de lui dire que j'ai abandonné la tentative de résoudre les problèmes d'authentification sur la WCF et allé directement à HTTplistener.
Cheers Guys :) Darrel, j'ai vu vos commentaires dans une autre discussion et me croire que je l'ai considéré comme une option. Heureusement, nous n'avons pas encore investi trop dans la WCF. Donc, nous pouvons aller de l'avant et le fossé.
J'ai trouvé la solution basée sur cette link et Ceci .
Le premier consiste à remplacer la méthode de validation dans une classe appelée CustomUsernameValidator B> Hérités de Système.IdidentityModel.Selectors.SernamePasswordValidator B>: P> <bindings>
<webHttpBinding>
<binding name="basicAuthBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" realm=""/>
</security>
</binding>
</webHttpBinding>
</bindings>
<service behaviorConfiguration="SimpleServiceBehavior" name="Service.webService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/webService" />
</baseAddresses>
</host>
<endpoint address="http://localhost:8000/webService/restful" binding="webHttpBinding" bindingConfiguration="basicAuthBinding" contract="Service.IwebService" behaviorConfiguration="HttpEnableBehavior"/>
</service>
Oui, vous pouvez fournir une authentification de base pour les services WCF basés sur le repos. Cependant, il y a plusieurs étapes que vous devez suivre pour avoir une solution Configurez votre service auto-hébergé pour avoir un certificat SSL lié au port que vous hébergez votre service WCF sur. Ceci est très différent de l'application d'un certificat SSL lors de l'utilisation de l'hébergement géré à travers quelque chose comme IIS. Vous devez appliquer le certificat SSL à l'aide d'un utilitaire de ligne de commande. Vous Appliquer et utiliser un Certificat SSL avec un service de WCF auto-hébergé P>
Création d'une WCF Service et sécurisez-le à l'aide de HTTPS sur SSL P> LI>
Configurez votre service pour utiliser l'authentification de base. Ceci est une solution de plusieurs parties également. 1er configure votre service pour utiliser l'authentification de base. La seconde consiste à créer un "CustomsusNamePasswordPasswordSadvalidatType" et inspecter les informations d'identification pour authentifier em> le client. Je vois que le dernier message a été échappé à cela, mais il a fait Services reposants: authentifiant les clients utilisant l'authentification de base p> li>
ol>
Il s'agit de la solution de bout en bout nécessaire à l'utilisation d'une authentification de base avec des services de WCF auto-hébergés. P>