6

如其他地方所述,我收到“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 问题有关,但我不确定如何解决它。

4

2 回答 2

3

在客户端设置端点身份对您没有帮助,因为问题在于执行客户端代码的安全上下文,而不是端点的配置。正如KennyW 解释的那样,如果您使用机器的完整域名访问 SharePoint 应用程序,则 Web 服务器进程中的模拟令牌(在 Windows 身份验证下提供您的 SharePoint 用户身份)将通过 Kerberos 获得并具有 NETWORK USERS 的成员身份团体。如果您仅使用机器名称,则 Kenny 所指的优化会通过 NTLM 为您获取登录令牌,该令牌不在 NETWORK USERS 组中,因此不会被 WCF 放置在管道和共享内存对象上的 ACL 拒绝访问服务器发布实际管道名称的位置。

该错误There was no endpoint listening at net.pipe://localhost...并不一定意味着在这样的命名管道端点上没有 WCF 服务:它也可能(在这种情况下确实如此)意味着虽然有一个,但您没有足够的访问权限来了解它,因为你有一个远程登录。

于 2011-01-11T13:58:57.410 回答
2

硬化后,NamedPipe 一直很痛苦:http: //msdn.microsoft.com/en-us/library/bb757001.aspx它实际上让我从 NamedPipe 更改为 TCP,而我需要在同一台机器上进行通信。

现在这并不意味着这是你的问题。如果您在一个帐户下运行并尝试在另一个帐户下连接,这通常会失败,因为命名管道不再被创建为全局(除非它是 LocalSys)。

我的建议是:

1) 消除您服务中的所有安全性。毕竟,NamedPipe 在同一台机器上运行,我相信通常不需要安全性。2)尝试连接。如果失败,请使用 SysInternals ProcExplorer 查看哪些对象进程已启动。如果它有一个命名管道,那么它就是硬化。

如果您提供更多信息,我应该能够为您提供更多帮助。

于 2010-09-16T18:07:51.970 回答