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

Posted

技术标签:

【中文标题】使用在端点上设置了标识的 WCF:正确的 UPN 不起作用【英文标题】:Consuming a WCF with an Identity set on Endpoint: correct UPN does not work 【发布时间】:2012-07-24 09:18:53 【问题描述】:

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

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

尊敬的社区,非常感谢您在此主题上提供的帮助。

谢谢

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

这似乎是一个相当好的观点。但我找到了一个更好的答案:只需使用CreateUpnIdentity 而不是CreateSpnIdentity。 WCF 处理名称检查。感谢@IanGilroy 提供的解决方案催化剂。

以上是关于使用在端点上设置了标识的 WCF:正确的 UPN 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WCF 和 REST 应用程序在同一端口上使用不同的端点,可以吗?

WCF 服务端点与主机基地址

减少 WCF 配置中的重复嵌套标识

WCF 服务错误没有在 HTTPS 上侦听的端点

无法连接到我的Localhost上的WCF服务

如何以编程方式修改 WCF app.config 端点地址设置?