使用在端点上设置标识的WCF:正确的UPN不起作用

时间:2012-07-24 09:18:53

标签: c# wcf windows-services

我写了一个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)。

换句话说,只有当我的客户端应用程序中的设置错误时,服务/用户名检查似乎才有效。

亲爱的社区,您对此主题的帮助将非常受欢迎。

由于

2 个答案:

答案 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