2

我编写了一个 Windows 服务托管的 WCF 服务。已部署或 localhost 工作正常,我的客户端应用程序可以使用它。

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

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

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

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

亲爱的社区,您在此主题上的帮助将不胜感激。

谢谢

4

2 回答 2

4

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

原因是服务器配置文件中没有任何 Identity 节点,并且使用域帐户作为服务用户,服务公开的默认身份是 UPN“account@domain”。

于 2012-07-24T17:19:23.850 回答
0

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

于 2012-07-24T12:50:41.390 回答