WCF-Sicherheit-Authentifizierung
Ich habe einen einfachen service und ich versuche zum einrichten der Authentifizierung. Auf dem client möchte ich die Benutzer, geben Sie Ihr Windows-Benutzerkonto. Und die WCF verwenden Sie den Benutzernamen/das Kennwort vom client und authentifizieren Sie gegen die Windows-Authentifizierung.
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 ist meine client-app.config
<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 ist mein code auf dem client
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 exception :
{"Sicheren Kanal kann nicht geöffnet werden, da die Sicherheitsaushandlung mit dem remote-Endpunkt fehlgeschlagen ist. Dies kann durch fehlende oder falsch angegeben EndpointIdentity in der EndpointAddress verwendet, um den channel zu erstellen. Bitte überprüfen Sie die EndpointIdentity angegeben oder implizit durch die EndpointAddress korrekt identifiziert den remote-Endpunkt. "}
{"Die Anfrage für die Sicherheits-token ist ungültig oder fehlerhafte Elemente."}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie es aussieht, generiert das service-und client-Konfiguration separat (von hand). Es ist in der Regel eine gute Idee, die zum generieren der client-Konfiguration aus dem service
svcutil
oder Visual Studio 'Add Service Reference'. Auf diese Weise wissen Sie, dass Sie die client-config, das entspricht der service config.Was Sie wollen, ist möglich, aber nicht WCF erlauben, übertragen Sie Ihre Benutzername/Kennwort-token im Klartext, wenn mit
wsHttpBinding
. Dies bedeutet, dass müssen Sie entweder host-Ihren Dienst über https oder über ein service-Zertifikat. Hier's einen post mit mehr details.Aber ich bin auch Fragen, warum Sie würde wollen, dass so etwas wie dieses. Kann es eine bessere Idee für die Verwendung der integrierten Windows-Authentifizierung. Dies ist auch die Standardeinstellung für
wsHttpBinding
. Auf diese Weise brauchen Sie nicht Ihre client(s), geben Sie Ihren Windows Benutzernamen/Kennwort.Denke ich, dass die Windows-Authentifizierung mit WsHttpBinding funktioniert nur mit https.
Sehen: http://msdn.microsoft.com/en-us/library/ff650619.aspx