Sto avendo una strana situazione qui. Ho funzionato, ma non capisco perché. La situazione è la seguente:Endpoint client WCF: SecurityNegotiationException senza <dns>
C'è un servizio WCF che la mia applicazione (un sito Web) deve chiamare. Il servizio WCF espone un netTcpBinding e richiede Transport Security (Windows). Il client e il server si trovano nello stesso dominio, ma su server diversi.
Così generando un risultato client nella seguente configurazione (per lo più valori predefiniti)
<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>
Quando eseguo il sito ed effettuare la chiamata al servizio, ottengo il seguente errore:
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)
....
Ora, se ho appena alterare la configurazione del client in questo modo:
<endpoint address="net.tcp://localhost:xxxxx/xxxx/xxx/1.0"
binding="netTcpBinding" bindingConfiguration="MyTcpEndpoint"
contract="Service.IMyService" name="TcpEndpoint">
<identity>
<dns />
</identity>
</endpoint>
tutto funziona e il mio server segnala felicemente che stato chiamato da th L'account di servizio che ospita l'AppPool per il mio sito web. Tutto bene.
La mia domanda ora è: perché funziona? Cosa fa questo? Sono arrivato a questa soluzione solo per tentativi ed errori. A me sembra che tutto il tag <dns />
indichi al client di utilizzare il DNS predefinito per l'autenticazione, ma non lo fa comunque?
UPDATE
Così, dopo un po 'di ricerca e di tentativi ed errori, non ho ancora trovato una risposta a questo problema. In alcuni casi, se non fornisco lo <dns />
, ottengo l'errore Credentials rejected
, ma se fornisco la configurazione <dns value="whatever"/>
, funziona. Perché?
Avendo tali problemi SSPI con le comunicazioni WCF client/servizio per un po 'di tempo, ma non è mai stato risolto correttamente e si è verificato solo con alcuni utenti su alcune macchine. L'identità "DNS" - anche se vuota - sembra fare il segno di spunta ... solo wow. –