netTCP绑定Soap安全协商失败

我正在写一个WCF服务需要模拟和会话。

我尝试在我的本地计算机上调用它时没关系,但是在远程计算机上它总是因为这样的错误而失败:

安全支持提供程序接口(SSPI)身份validation失败。 服务器可能未在具有标识“host / hostname”的帐户中运行。 如果服务器在服务帐户(例如,网络服务)中运行,请将该帐户的ServicePrincipalName指定为服务器的EndpointAddress中的标识。 如果服务器在用户帐户中运行,请将该帐户的UserPrincipalName指定为服务器的EndpointAddress中的标识。

如果我提供了upn,它会抛出一个身份失败的exception。

这是我的配置:

服务器配置(APP):

                                    

客户端配置:

                         

任何帮助将不胜感激。

Windows服务使用用户主体名称或服务主体名称( 文档 )注册自己。 引用该链接:“ 如果服务在LocalSystem,LocalService或NetworkService帐户下运行,则默认情况下会以host /的forms生成服务主体名称(SPN),因为这些帐户可以访问计算机的SPN数据。如果该服务在不同的帐户下运行,Windows Communication Foundation(WCF)将以@的forms生成UPN。 “实际上,此引用与您的错误消息所声明的内容非常相似。 所以似乎……

a)如果服务在本地服务帐户或类似的标准帐户下运行,则需要调整客户端配置文件以使其具有此值,其中实际服务器的名称为“address”且端点在端口4503上运行:

    

b)或者,如果您在专用服务帐户下运行(我们在域名“MyDomain”上将其称为“ServiceAccount”),那么您需要

    

请注意,您可能需要在两种情况下使用完全限定的域名,包括林和树级别。 对于私有LAN / WAN内的简单域,这将表示address.MyDomain.local和ServiceAccount@MyDomain.local。 如果您的域位于名为MyTree的树中,那么它将是ServiceAccount@MyDomain.MyTree.local; 如果它位于名为MyForest的林中,那么它将是Serviceaccount@MyDomain.MyTree.MyForest.local(和ServicePrincipalName类似)。 使用Kerberos进行身份validation时,需要完全限定名称。

还有一个肮脏的黑客,在这里 , 这里和这里发布,并在这里进行分析。

您可以提供虚拟服务主体名称(SPN)。 在这种情况下,WCF不会失败,但会回退到NTLM以进行身份​​validation,而不会validation主体。

所以,配置:

     

并以编程方式

  EndpointIdentity identity = EndpointIdentity.CreateSpnIdentity("dummy"); 

使用ChannelFactory:

  Uri uri = new Uri("net.tcp://:/myServiceAddress"); ChannelFactory channelFactory = new ChannelFactory(new NetTcpBinding()); channelFactory.CreateChannel(new EndpointAddress(uri, identity) 

也会工作。