Я получаю сообщение об ошибке «Не было прослушивания конечной точки на net.pipe://localhost», как описано в других местах, но я не могу найти реальный ответ.
Это отличный идентификатор проблемы: http://kennyw.com/indigo/102.
При использовании WCF проверка подлинности Windows выполняется с помощью SSPI-Negotiate, который в большинстве случаев выбирает Kerberos в качестве фактического механизма проверки подлинности. Однако, если целевое имя участника-службы, переданное в SSPI, является правильно сформированным именем участника-службы для учетной записи локального компьютера (например, хост/[имя машины DNS]), то согласование будет использовать NTLM (оптимизация замыкания на себя), а маркер доступа не будет иметь сетевой идентификатор безопасности (и поэтому его можно будет использовать с NetNamedPipes).
Но он не говорит мне, как решить проблему. Я создаю свою конечную точку программно.
var binding = new NetNamedPipeBinding();
binding.Security.Mode = NetNamedPipeSecurityMode.Transport;
binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
var id = EndpointIdentity.CreateSpnIdentity("host/" + Environment.MachineName);
var endpointAddress = new EndpointAddress(new Uri(serviceClientUrl), id);
var client = new ServiceClient(binding, endpointAddress);
Я предполагаю, что моя проблема связана с CreateSpnIdentity, но я не уверен, какое значение использовать.
Дополнительная информация. Чтобы уточнить это для большего контекста. Служба Wcf размещается как служба Windows, работающая под учетной записью NetworkService (я пробовал локальную систему). Служба создается с помощью конструктора NetNamedPipeBinding по умолчанию:
host.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "ServiceName");
Я создал веб-часть SharePoint, которая использует эту службу. Суть в том, что если на сайте SharePoint настроена проверка подлинности на основе форм или в URL-адресе при проверке подлинности Windows используется только имя компьютера, то проблем не возникает. ТОЛЬКО если полное имя компьютера используется для URL-адреса при проверке подлинности Windows, я получаю указанную выше ошибку.
Я почти уверен, что это связано с проблемами NTLM Kerberos, описанными в статье, но я не знаю, как это обойти.