我写了一个Windows服务托管的WCF服务。部署或localhost工作正常,我的客户端应用程序可以使用它。
如果我更改Windows服务的LogOn设置并设置域用户(从默认的“本地系统”更改),我的客户端应用程序将无法再使用该服务。我得到的例外是
A call to SSPI failed
没有内部异常或任何细节。为了解决这个问题,我尝试在我的客户端应用程序请求中设置UPN,以便获得有效的服务名称检查。这是通过代码在客户端完成的,在端点中设置标识:
string uri = "myServiceUri";
EndpointIdentity identity = EndpointIdentity.CreateSpnIdentity("user@domain");
EndpointAddress epa = new EndpointAddress(uri, identity, new AddressHeader[] { });
出现了非常奇怪的行为。
如果我在客户端请求中设置了准确的UPN,请说“user @ domain”, 我得到一个新的异常(没有内部异常,没有细节)
The following remote identity failed verification: 'user@domain'
如果我在客户端请求中将任何其他字符串设置为UPN,它可以正常工作, 让我们说“ XXXuser @ domainXXX ”,“ toto ”,甚至 String.Empty 。
服务器端,我没有在配置文件中设置任何Identity节点来保持默认行为,即UPN检查(没有SPN也没有DNS)。
换句话说,只有当我的客户端应用程序中的设置错误时,服务/用户名检查似乎才有效。
亲爱的社区,您对此主题的帮助将非常受欢迎。
由于
答案 0 :(得分:3)
解决方案是......使用CreateUpnIdentity
而不是CreateSpnIdentity
让WCF正确处理UPN。
原因是,如果服务器配置文件和中没有任何Identity节点,并且域帐户作为服务用户,则服务公开的默认标识是UPN“account @ domain”。
答案 1 :(得分:0)
我似乎记得使用不存在的UPN会强制身份验证从Kerberos回退到NTLM。要使Kerberos使用域帐户,我认为您需要为目标帐户配置SPN:http://msdn.microsoft.com/en-us/library/bb628618.aspx