使用Endpoint:正确UPN上设置了标识的WCF不起作用



我编写了一个Windows服务托管的WCF服务。部署或本地主机运行良好,我的客户端应用程序可以使用它。

如果我更改Windows服务的登录设置并设置域用户(从默认的"本地系统"更改),我的客户端应用程序将无法再使用该服务。我得到的例外是

A call to SSPI failed

没有任何内部异常或任何细节。为了解决这个问题,我尝试在客户端应用程序请求中设置UPN,以便进行有效的服务名称检查。这是在客户端通过代码完成的,在端点中设置一个Identity:

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",甚至字符串。空.

在服务器端,我没有在配置文件中设置任何标识节点来保持默认行为,即UPN检查(没有SPN或DNS)。

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

亲爱的社区,非常感谢您在这个话题上的帮助。

感谢

解决方案是…使用CreateUpnIdentity而不是CreateSpnIdentity来让WCF正确处理UPN。

原因是服务器配置文件中没有任何Identity节点,域帐户作为服务用户,服务暴露的默认身份是UPN"account@domain".

我似乎记得,使用不存在的UPN会迫使身份验证从Kerberos回退到NTLM。要使Kerberos与域帐户一起工作,我认为您需要为目标帐户配置SPN:http://msdn.microsoft.com/en-us/library/bb628618.aspx

最新更新