У меня здесь странная ситуация. У меня это работает, но я не понимаю, почему. Ситуация такова:Конечная точка клиента WCF: SecurityNegotiationException без <dns>
Служба WCF, на которую мне нужно позвонить (веб-сайт). Служба WCF предоставляет netTcpBinding и требует безопасности транспорта (Windows). Клиент и сервер находятся в одном домене, но на разных серверах.
Таким образом генерируя клиента результаты в следующей конфигурации (в основном по умолчанию)
<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>
Когда я запускаю веб-сайт и сделать звонок на службу, я получаю следующее сообщение об ошибке:
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)
....
Теперь, если я просто изменить конфигурацию клиента следующим образом:
<endpoint address="net.tcp://localhost:xxxxx/xxxx/xxx/1.0"
binding="netTcpBinding" bindingConfiguration="MyTcpEndpoint"
contract="Service.IMyService" name="TcpEndpoint">
<identity>
<dns />
</identity>
</endpoint>
все работает и мой сервер с радостью сообщает, что он получил колл от го e, который содержит AppPool для моего веб-сайта. Все хорошо.
Мой вопрос сейчас: почему это работает? Что это делает? Я добрался до этого решения простой пробной ошибкой. Мне кажется, что все теги <dns />
говорят клиенту использовать DNS по умолчанию для аутентификации, но разве это не так?
UPDATE
Таким образом, после некоторых больше исследований и проб и ошибок, я до сих пор не нашел ответ на эту проблему. В некоторых случаях, если я не предоставляю <dns />
, я получаю ошибку Credentials rejected
, но если я предоставляю конфигурацию <dns value="whatever"/>
, она работает. Зачем?
Имея проблемы с SSPI с нашим клиентом/службой WCF в течение некоторого времени, но никогда не смог правильно его решить, и это произошло только с некоторыми пользователями на некоторых машинах. Идентификатор «DNS» - даже пустой - кажется, делает тик ... просто вау. –