2017-02-06 4 views
0

Ich habe eine sehr einfache WFCSerice geschrieben, die den Windows-Benutzernamen zurückgibt. Hier ist der Client-Seite Code:Basic Authentication scheint keinen Sicherheits-Header zu haben

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

ich die Anmeldeinformationen in den HTTP-Header sehen können mit Fidddler:

enter image description here

ich versucht habe, das Gleiche mit Basic Authentication (Zugriff auf eine andere Bahn zu tun Dienst, der die Standardauthentifizierung unterstützt). Hier ist der Client-Seite Code:

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

     } 

Hier ist der Screenshot von Fiddler, wenn Basis-Authentifizierung:

enter image description here

Warum gibt es nichts in der Kopfzeile, wenn Basis-Authentifizierung verwenden. Der Standardauthentifizierungsdienst scheint wie erwartet zu funktionieren. Hier ist die Antwort (interessanter es erscheinen zwei Anfragen und zwei Antworten sein):

enter image description here

+0

Haben Sie die anonyme Authentifizierung deaktiviert und die Standardauthentifizierung deaktiviert? ed in IIS? Der Berechtigungsheader wird erst nach einer 401-Anfrage vom Server zur Anfrage hinzugefügt. Wenn die Anfrage anonym erlaubt ist, gibt es keine 401 und daher keine Notwendigkeit für den Header. – user1429080

+0

@ user1429080, beide sind aktiviert. – w0051977

+0

Versuchen Sie, die anonyme Authentifizierung zu deaktivieren. Macht es einen Unterschied? – user1429080

Antwort

1

Standardauthentifizierung arbeitet auf der HTTP Ebene. Der allgemeine Fluss besteht darin, dass der Client eine Ressource anfordert, worauf der Server eine Abfrage absetzt. Anschließend gibt der Client eine neue Anforderung mit einem Header Authorization aus. Wenn der Benutzername und das Passwort im Header Authorization vom Server akzeptiert werden, fügt der Client normalerweise den Header für die nachfolgende Anfrage hinzu, ohne die Schritte request - challenge - re-request-with-authorization erneut zu durchlaufen.

Wenn Sie alles richtig eingerichtet haben, sollten Sie zwei Anfragen in Fiddler erwarten.

  1. Eine Anfrage ohne Authorization Header enthalten. Die Antwort vom Server für diese Anforderung ist eine 401 mit einem Header .
  2. Dann sollten Sie eine zweite Anfrage sehen, wo ein Authorization Header vom Client gesendet wurde.

Hier ein Beispiel aus meiner Umgebung:

enter image description here

Wenn Sie die 401 Herausforderung vom Server nicht angezeigt wird, dann die Standardauthentifizierung ist nicht richtig eingerichtet.

Damit der Service-Proxy den Header bereitstellen kann, müssen Sie die Client-Bindung für die Verwendung von <transport clientCredentialType="Basic"/> konfigurieren. Oder das ist, was ich getan habe, wer weiß mit WCF mit seinen unzähligen Konfigurationsoptionen.

EDIT: Ich habe diese auf der Serviceseite:

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

Auf dem 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> 

I basicHttpBinding, TransportCredentialOnly und Basic, um dies ohne SSL Aufwand leicht zu testen usw.

+0

Danke. Ich habe versucht, was du vorgeschlagen hast. Noch keine Sicherheit in der Kopfzeile. Die Standardauthentifizierung funktioniert so, wie ich es erwarten würde, aber ich habe überhaupt keine Ahnung, wie die Anmeldeinformationen an den Server weitergeleitet werden. – w0051977

+0

Nein, tue ich nicht. Muss es eine BasicHttpBinding für die Anmeldeinformationen sein, die in der Kopfzeile übergeben werden? Meine Nachforschungen sagen mir, dass die Anmeldeinformationen in der SOAP-Nachricht (verschlüsselt) mit wsHttpBinding übergeben werden. Ich bin ziemlich neu dazu. – w0051977

+0

Welche Bindung verwenden Sie? Was ist der Sicherheitsmodus? – w0051977

Verwandte Themen