web*_*res 6 wcf spn netnamedpipebinding
我正在收到"没有端点监听net.pipe:// localhost"错误,如其他地方所述,但我似乎无法找到真正的答案.
这是问题的一个很好的标识:http: //kennyw.com/indigo/102
使用WCF时,Windows身份验证是通过SSPI-Negotiate执行的,在大多数情况下,它将选择Kerberos作为实际的身份验证机制.但是,如果传递给SSPI的目标SPN是本地计算机帐户的格式良好的SPN(例如主机/ [dns机器名称]),那么Negotiate将使用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);
Run Code Online (Sandbox Code Playgroud)
我猜我的问题出在CreateSpnIdentity中,但我不确定要使用什么值.
附加信息: 详细说明这一点以获取更多背景信息.Wcf服务作为在NetworkService帐户下运行的Windows服务托管(我尝试过本地系统).使用默认的NetNamedPipeBinding构造函数创建服务:
host.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "ServiceName");
Run Code Online (Sandbox Code Playgroud)
我创建了一个使用此服务的SharePoint Webpart.问题是,如果SharePoint站点设置为基于表单的身份验证,或者只是在Windows身份验证下的URL中使用了计算机名称,那么就没有问题.仅当在Windows身份验证下将完全限定的计算机名用于URL时才会出现上述错误.
我很确定这与文章中描述的NTLM Kerberos问题有关,但我不确定如何绕过它.
在客户端设置端点标识对您没有帮助,因为问题在于执行客户端代码的安全上下文,而不是端点的配置。正如KennyW 所解释的,如果您使用计算机的完整域名访问 SharePoint 应用程序,则 Web 服务器进程中的模拟令牌(在 Windows 身份验证下提供您的 SharePoint 用户身份)将通过 Kerberos 获得,并具有网络用户的成员身份团体。如果您仅使用计算机名称,Kenny 提到的优化会通过 NTLM 为您获取登录令牌,该令牌不在 NETWORK USERS 组中,因此不会被 WCF 放置在管道和共享内存对象上的 ACL 拒绝访问服务器在其中发布实际的管道名称。
该错误There was no endpoint listening at net.pipe://localhost...并不一定意味着没有 WCF 服务正在侦听此类命名管道端点:它还可能(在本例中确实如此)意味着虽然有一个,但您没有足够的访问权限来了解它,因为你有远程登录。