WCF WSHttpBinding SOAP安全协商失败
本文关键字:协商 失败 安全 SOAP WSHttpBinding WCF | 更新日期: 2023-09-27 18:22:17
我有一个使用WSHttpBinding的非常简单的WCF自托管服务,但它拒绝工作。如果服务和客户端在同一台机器上运行,没有问题,但一旦我将服务移动到窗口服务器2008,客户端就无法与进行通信
异常
[System.ServiceModel.Security.SecurityNegotiationException]{"与"的SOAP安全协商http://hvw-svr-01/SIT'用于目标'http://hvw-svr-01/SIT'失败。有关详细信息,请参阅内部异常。"}
内部异常
[System.ComponentModel.Win32Exception]{"安全支持提供程序接口(SSPI)协商失败。服务器可能不是在标识为"host/hvw-svr-01"的帐户中运行的。如果服务器是在服务帐户(例如网络服务)中运行的,在服务器的EndpointAddress中指定帐户的ServicePrincipalName作为标识。如果服务器在用户帐户中运行,请在服务器的EndpointAddress中指定帐户的UserPrincipalName作为标识。"}
由于它是一个自托管服务,我想我需要指定UserPrincipalName,但无论我为该属性尝试什么,它都无法工作。
- 域''用户名
- domain@username
- 主机/本地主机
- 主机/hvw-svr-01
- 。。。等等
也尝试了不同的用户帐户,包括内置的管理员。如果我尝试BasicHttpBinding而不是WSHttpBinding,那么一切都会按预期进行。我在谷歌(和stackoverflow)上读了很多关于这个问题的文章,但我仍然不知道问题是什么,以及如何指定那个身份。
编辑:Service App.Config
<system.serviceModel>
<services>
<service name="SIT.Communication.Gate">
<host>
<baseAddresses>
<add baseAddress="http://localhost:2323/SIT" />
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="SIT.Core.IGate">
<identity>
<dns value="localhost"/>
<userPrincipalName value="XZDom'DGrain"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
编辑:客户端本身基本上就是这个代码片段
ChannelFactory<IGate> sitFactory = new ChannelFactory<IGate>(new WSHttpBinding(), new EndpointAddress("http://hvw-svr-01:2323/SIT")); IGate sitProxy = sitFactory.CreateChannel(); bool pong = sitProxy.Ping(); <------ throws exception
要使协商进程能够选择Kerberos协议进行网络身份验证,客户端应用程序必须提供SPN、用户主体名称(UPN)或NetBIOS帐户名称作为目标名称。如果客户端应用程序未提供目标名称,则协商进程无法使用Kerberos协议。如果协商进程无法使用Kerberos协议,则协商进程将选择NTLM协议。
在跨域中,必须使用kerberos。由于服务以本地系统帐户的身份运行,因此必须在客户端为目标名称使用SPN标识。
有关更多信息,请阅读http://support.microsoft.com/kb/929650
希望这能有所帮助!
如果WSHttpBinding
不是实际必需的,则可以选择基本HTTP绑定。:)
基本HTTP消除了<identiy>
标记,因此不会出现UPN和SPN问题。
我遇到了同样的问题,我尝试了web.config和IIS服务器中的几乎所有设置。对我来说,最好的方法是在创建客户端时设置UPN:
EndpointAddress endptAddress =
new EndpointAddress(
new Uri(your URL),
EndpointIdentity.CreateUpnIdentity("domain'username"));