Ich habe eine seltsame Situation hier. Ich habe es funktioniert, aber ich verstehe nicht warum. Situation ist wie folgt:WCF-Client-Endpunkt: SecurityNegotiationException ohne <dns>
Es gibt einen WCF-Dienst, den meine Anwendung (eine Website) aufrufen muss. Der WCF-Dienst macht eine netTcpBinding verfügbar und erfordert Transportsicherheit (Windows). Client und Server befinden sich in derselben Domäne, aber auf verschiedenen Servern.
So ein Client Ergebnis in der folgenden config (meist standardmäßig)
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="MyTcpEndpoint" ...>
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:xxxxx/xxxx/xxx/1.0"
binding="netTcpBinding" bindingConfiguration="MyTcpEndpoint"
contract="Service.IMyService" name="TcpEndpoint"/>
</client>
</system.serviceModel>
zu erzeugen, wenn ich die Website ausführen und den Aufruf an den Dienst machen, bekomme ich folgende Fehlermeldung:
System.ServiceModel.Security.SecurityNegotiationException: Either the target name is incorrect or the server has rejected the client credentials. ---> System.Security.Authentication.InvalidCredentialException: Either the target name is incorrect or the server has rejected the client credentials. ---> System.ComponentModel.Win32Exception: The logon attempt failed
--- End of inner exception stack trace ---
at System.Net.Security.NegoState.EndProcessAuthentication(IAsyncResult result)
at System.Net.Security.NegotiateStream.EndAuthenticateAsClient(IAsyncResult asyncResult)
at System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeInitiator.InitiateUpgradeAsyncResult.OnCompleteAuthenticateAsClient(IAsyncResult result)
at System.ServiceModel.Channels.StreamSecurityUpgradeInitiatorAsyncResult.CompleteAuthenticateAsClient(IAsyncResult result)
--- End of inner exception stack trace ---
Server stack trace:
at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
....
Jetzt, wenn ich die Konfiguration des Clients nur ändern, wie so:
<endpoint address="net.tcp://localhost:xxxxx/xxxx/xxx/1.0"
binding="netTcpBinding" bindingConfiguration="MyTcpEndpoint"
contract="Service.IMyService" name="TcpEndpoint">
<identity>
<dns />
</identity>
</endpoint>
alles funktioniert und mein Server meldet glücklich, dass es durch th genannt wurde Der Dienstaccount, der den AppPool für meine Website hostet. Alles gut.
Meine Frage ist jetzt: warum funktioniert das? Was macht das? Ich kam zu dieser Lösung durch bloßes Versuch-und-Irrtum. Für mich scheint es, dass alle <dns />
Tag ist sagen, dass der Client die Standard-DNS für die Authentifizierung verwenden, aber tut es das nicht trotzdem?
UPDATE
Nach einiger mehr Forschung und Trial-and-error, ich habe immer noch keine Antwort auf dieses Problem gefunden. In einigen Fällen, wenn ich die <dns />
nicht bereitstellen, erhalte ich die Credentials rejected
Fehler, aber wenn ich die <dns value="whatever"/>
Config bereitstellen, funktioniert es. Warum?
Solche SSPI-Probleme mit unserer Client/Service-WCF-Kommunikation hatten wir schon länger, konnten sie aber nie richtig lösen und traten nur bei einigen Benutzern auf einigen Rechnern auf. Die "DNS" Identität - auch eine leere - scheint den Tick zu machen ... einfach wow. –