2017-02-06 1 views
0

J'ai écrit un WFCSerice très simple qui renvoie le nom d'utilisateur Windows fourni. Voici le code côté client:L'authentification de base ne semble pas avoir d'en-tête de sécurité

public Form1() 
     { 
      ServiceReference1.Service1Client s1 = new ServiceReference1.Service1Client(); 
      s1.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials; 
      string str = s1.ReturnWindowsUsername(); 
      InitializeComponent(); 
     } 

je peux voir les informations d'identification dans l'en-tête HTTP à l'aide Fidddler:

enter image description here

J'ai essayé de faire la même chose avec l'authentification de base (accès à un autre web service prenant en charge l'authentification de base). Voici le code côté client:

public Form1() 
     { 
      InitializeComponent(); 
      ServiceReference1.Service1Client s1 = new ServiceReference1.Service1Client(); 
      s1.ClientCredentials.UserName.UserName = "testuser"; 
      s1.ClientCredentials.UserName.Password = "testpassword"; 
      string str = s1.GetData(1); 

     } 

Voici la capture d'écran de Fiddler lorsque vous utilisez l'authentification de base:

enter image description here

Pourquoi est-il rien dans l'en-tête lors de l'utilisation d'authentification de base. Le service d'authentification de base semble fonctionner comme prévu. Voici la réponse (semble intéressant de noter qu'il y ait deux demandes et deux réponses):

enter image description here

+0

Avez-vous l'authentification anonyme désactivée, et authentification de base enabl ed dans IIS? L'en-tête Authorization n'est ajouté à la requête * qu'après * un challenge 401 du serveur. Si la requête est autorisée de manière anonyme, il n'y a pas de 401 et donc pas besoin de l'en-tête. – user1429080

+0

@ user1429080, les deux sont activés. – w0051977

+0

Essayez de désactiver l'authentification anonyme. Est-ce que cela fait une différence? – user1429080

Répondre

1

l'authentification de base fonctionne au niveau HTTP. Le flux général est que le client demande une ressource, puis le serveur lance un défi, puis le client émet une nouvelle requête avec un en-tête Authorization inclus. Si le nom d'utilisateur et le mot de passe dans l'en-tête Authorization sont acceptés par le serveur, le client ajoute généralement l'en-tête pour la demande suivante sans passer par les étapes request - challenge - re-request-with-authorization.

Si vous avez tout configuré correctement, vous devriez vous attendre à voir deux demandes dans Fiddler.

  1. Une demande sans Authorization en-tête incluse. La réponse du serveur pour cette demande sera un 401 avec un en-tête WWW-Authenticate: Basic realm="your realm" attaché.
  2. Ensuite, vous devriez voir une deuxième requête où un en-tête Authorization a été envoyé par le client.

Voici un échantillon de mon environnement:

enter image description here

Si vous ne voyez pas le 401 défi du serveur, l'authentification de base n'est pas configuré correctement.

Pour que le proxy de service fournisse l'en-tête, vous devez configurer votre liaison client pour utiliser <transport clientCredentialType="Basic"/>. Ou c'est ce que j'ai fait, qui sait avec WCF avec sa myriade d'options de configuration.

EDIT: J'ai utilisé ce côté service:

<bindings> 
    <basicHttpBinding> 
    <binding name="httpTransportCredentialOnlyBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Sur le client:

<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_IService1"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost:53156/Service1.svc" binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IService1" contract="WcfTest_CBT.IService1" 
    name="BasicHttpBinding_IService1" /> 
</client> 

J'utilise basicHttpBinding, TransportCredentialOnly et Basic afin de tester cela facilement sans tracas SSL

+0

Merci. J'ai essayé ce que tu as suggéré. Toujours pas de sécurité dans l'en-tête. L'authentification de base fonctionne comme je m'attendais cependant, je n'ai absolument aucune idée de la façon dont les informations d'identification sont transmises au serveur. – w0051977

+0

Non, je ne le fais pas. Est-ce que cela doit être un BasicHttpBinding pour que les informations d'identification soient transmises dans l'en-tête? Ma recherche me dit que les informations d'identification sont passées dans le message SOAP (chiffré) avec wsHttpBinding. Je suis assez nouveau à cela. – w0051977

+0

Quelle liaison utilise-t-on? Quel est le mode de sécurité? – w0051977