如其他地方所述,我收到“net.pipe://localhost 没有端点监听”错误,但我似乎找不到真正的答案。
这是问题的一个很好的标识符:http: //kennyw.com/indigo/102
使用 WCF 时,Windows 身份验证是通过 SSPI-Negotiate 执行的,在大多数情况下会选择 Kerberos 作为实际的身份验证机制。但是,如果传递给 SSPI 的目标 SPN 是本地计算机帐户的格式正确的 SPN(例如主机/[dns 机器名称]),则协商将使用 NTLM(环回优化)并且访问令牌将没有网络 SID(并且因此将可与 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 服务托管为在 NetworkService 帐户下运行的 Windows 服务(我尝试过本地系统)。该服务是使用默认的 NetNamedPipeBinding 构造函数创建的:
host.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "ServiceName");
我创建了一个使用此服务的 SharePoint Webpart。更重要的是,如果 SharePoint 网站设置为基于表单的身份验证,或者在 Windows 身份验证下的 url 中仅使用机器名称,则没有问题。只有当 Windows 身份验证下的 url 使用完全限定的机器名称时,我才会收到上述错误。
我很确定这与文章中描述的 NTLM Kerberos 问题有关,但我不确定如何解决它。