代码之家  ›  专栏  ›  技术社区  ›  webwires

在NetNamedPipe服务终结点的endpointaddress上设置SPN

  •  6
  • webwires  · 技术社区  · 16 年前

    我听到的是“没有终点在听”网管://localhost“其他地方描述的错误,但我似乎找不到真正的答案。

    http://kennyw.com/indigo/102

    使用WCF时,Windows身份验证 Kerberos作为实际身份验证 机制。但是,如果目标SPN 传递给SSPI的是一个格式良好的SPN 对于本地计算机帐户(例如。 主机/[dns机器名]),然后 优化)和访问令牌 将没有网络SID(和 网络名称管道)。

    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);
    

    详细说明这一点,以了解更多的情况。Wcf服务作为运行在NetworkService帐户下的Windows服务托管(我尝试了本地系统)。使用默认的NetNamedPipeBinding构造函数创建服务:

    host.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "ServiceName");
    

    仅限 如果在Windows身份验证下将完全限定的机器名用于url,则会出现上述错误。

    我很确定这与本文中描述的ntlmkerberos问题有关,但我不确定如何解决它。

    2 回复  |  直到 16 年前
        1
  •  3
  •   MatthewMartin muthu    12 年前

    在客户端设置端点标识对您没有帮助,因为问题是执行客户端代码的安全上下文,而不是端点的配置。作为 KennyW explains ,如果您使用计算机的完整域名访问SharePoint应用程序,则web服务器进程中的模拟令牌(在Windows身份验证下提供您的SharePoint用户标识)将通过Kerberos获得,并且具有网络用户组的成员资格。如果只使用机器名,Kenny引用的优化将通过NTLM获取登录令牌,该令牌不在NETWORK USERS组中,因此不会被WCF放置在管道和服务器发布实际管道名的共享内存对象上的acl拒绝访问。

    错误 There was no endpoint listening at net.pipe://localhost... 并不一定意味着没有WCF服务监听这样一个命名管道端点:它也可能(在本例中是这样)意味着尽管有一个端点,但是您没有足够的访问权限来了解它,因为您有远程登录。

        2
  •  2
  •   Aliostad    16 年前

    命名管道硬化后背部疼痛: http://msdn.microsoft.com/en-us/library/bb757001.aspx 当我需要在同一台机器上通信时,它实际上让我从NamedPipe变成了TCP。

    我的建议是:

    1) 从您的服务中消除所有安全性。毕竟,NamedPipe运行在同一台机器上,我相信通常不需要安全性。

    推荐文章