2010-09-01 4 views
8

Ich habe einen einfachen Dienst und ich versuche, Authentifizierung einzurichten. Auf dem Client möchte ich, dass der Benutzer sein Windows-Benutzerkonto eingibt. Die WCF verwendet den vom Client bereitgestellten Benutzernamen und das Kennwort und authentifiziert sie gegen die Windows-Authentifizierung.WCF-Sicherheitsauthentifizierung

Hier ist mein Server App.Config

<system.serviceModel> 
    <services> 
     <service name="WcfService.Service1" behaviorConfiguration="WcfService.Service1Behavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress = "http://localhost:8731/Design_Time_Addresses/WcfService/Service1/" /> 
      </baseAddresses> 
     </host> 
     <endpoint address ="" binding="wsHttpBinding" contract="WcfService.IService1"> 
      <identity> 
      <dns value="localhost"/> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WcfService.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 

      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode = "Windows"/> 
      </serviceCredentials> 

     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Hier app.config mein Klient ist

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IService1"> 

       <security mode = "Message"> 
       <message clientCredentialType = "UserName"/> 
       </security> 

      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:8731/Design_Time_Addresses/WcfService/Service1/" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1" 
      contract="ServiceReference1.IService1" name="WSHttpBinding_IService1"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Hier auf dem Client ist mein Code

ServiceReference1.Service1Client client = new WcfAuthentication.ServiceReference1.Service1Client(); 

client.ClientCredentials.UserName.UserName = "mywindowsusername"; 
client.ClientCredentials.UserName.Password = "mywindowsuserpassword"; 
Console.WriteLine(client.GetData(5)); 

Aber ich bin immer diese Ausnahme bekommen:

{"Sicherer Kanal kann nicht geöffnet werden, weil die Sicherheitsaushandlung mit dem Remote-Endpunkt fehlgeschlagen ist. Dies kann an einer fehlenden oder falsch angegebenen EndpointIdentity in der EndpointAddress liegen, die zum Erstellen des Kanals verwendet wird. Überprüfen Sie, ob die von EndpointAddress angegebene oder implizierte EndpointIdentität den Remote-Endpunkt korrekt identifiziert. „} {“ Der Antrag auf Sicherheitstoken hat ungültige oder fehlerhafte Elemente "}

Antwort

7

Es sieht aus wie Sie erzeugen Die Konfiguration des Dienstes und des Clients ist getrennt (von Hand) .Es ist in der Regel eine gute Idee, die Client-Konfiguration vom Dienst unter Verwendung von svcutil oder Visual Studio's 'Add Service Reference' zu generieren.Auf diese Weise wissen Sie, dass Sie die Client-Konfiguration erhalten Servicekonfig

Was Sie wollen, ist möglich, aber WCF erlaubt Ihnen nicht, Ihr Benutzername/Passwort-Token im Klartext zu übertragen, wenn Sie wsHttpBinding verwenden. Dies bedeutet, dass Sie Ihren Dienst entweder mit https hosten oder ein Dienstzertifikat verwenden müssen. Here ist ein Beitrag mit einigen weiteren Details.

Aber ich frage mich auch, warum Sie so etwas wollen. Es könnte eine bessere Idee sein, die integrierte Windows-Authentifizierung zu verwenden. Dies ist sogar die Standardeinstellung für wsHttpBinding. Auf diese Weise brauchen Sie Ihren/Ihre Kunden nicht, um ihren Windows Benutzernamen/Passwort einzugeben.

+1

Interessant, macht den Sinn, dass es eine sichere Verbindung verwenden muss. Es war nur eine Übung, um die verschiedenen Authentifizierungsmöglichkeiten von WCF zu verstehen. In der echten Welt. Es ist für meine mobile Anwendung, die der Benutzer Windows-Anmeldedaten auf seinem mobilen Gerät bereitstellen muss. Also benutze das Bashttpbinding und sichere die Kommunikation mit SSL (https). So sollte zum Beispiel oben ein nettcpbinding gut korrekt sein, da ich denke, dass es standardmäßig die Transportsicherheit verwendet, die bereits mit tcp verschlüsselt sein sollte. – pdiddy

-2
binding.Security = new WSHttpSecurity{Mode = SecurityMode.None};