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)
也会工作。
- 响应消息的内容类型application / xml; charset = utf-8与绑定的内容类型不匹配(text / xml; charset = utf-8)
- 如何解决“HTTP错误404.3 – 未找到”错误?
- 从SAML令牌中读取SAML属性
- .NET 4.5和.NET 4.5.1默认启用TLS 1.1和TLS 1.2
- 如何将WCF模板添加到Visual Studio Express?
- 使用WCF SOAP API中的HTTP授权标头进行身份validation
- 反序列化从Android应用程序发送到WCF Web服务的JSON对象
- 如何将带有循环引用的对象结构序列化为Json?
- 标记WCF合同中已弃用的字段