与 FQDN 一起使用时,WCF TransportCredentialOnly 安全中断
Posted
技术标签:
【中文标题】与 FQDN 一起使用时,WCF TransportCredentialOnly 安全中断【英文标题】:WCF TransportCredentialOnly security breaks when used with FQDN 【发布时间】:2014-10-21 20:03:52 【问题描述】:在同一个仅限 Intranet 的机器上,我有一个 IIS 8 托管网站,它调用第二个 IIS 托管 WCF 服务。
为这两个应用程序启用了 Windows 身份验证(所有其他应用程序都已禁用) 网站托管在域服务帐户下。 在 IIS AppPool 用户下托管的 WCF 服务站点。绑定如下所示:
<binding name="BasicHttpBinding_ServiceName" sendTimeout="00:05:00">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
当网站使用 netbios 或 IP 地址访问服务时,一切正常。但是,我现在想在生产环境中使用 FQDN(http://services.company.local 和 http://web.company.local)。一旦我尝试通过 FQDN 调用 WCF 服务,我就会收到 401 uauthorized 并带有以下异常消息:
MessageSecurityException:HTTP 请求未经客户端授权 身份验证方案“协商”。收到的认证头 来自服务器的是“协商,NTLM”。
我尝试将 clientCredentialType 更改为 NTLM 并从 IIS 身份验证中删除协商提供程序(如另一个 SO 问题中所建议)但没有成功(相同的错误消息,只是从服务器收到的标头是“NTLM”而不是“协商,NTLM”。从其他研究看来,与为该站点创建的两个子域相关联的 SPN 可能存在问题,但我不确定 1. 如何检查这些域的 SPN,2. 什么SPN 应该是,并且 3. 如果考虑到我正在使用内核模式身份验证,这仍然相关。
【问题讨论】:
【参考方案1】:问题确实是缺少 SPN。要回答我自己的问题,是的,它们仍然与使用内核模式身份验证相关,唯一的区别是它们不再需要绑定到运行 AppPool 的帐户,而只需绑定到机器帐户。
为了将来参考,这个SPN Checklist for Kerberos Authentication with IIS 7.0/7.5 在最初配置一切时非常有用。特别是,访问具有自定义主机名的站点确实需要创建额外的 SPN。例如,对于通过http://services.company.local 访问的名为 COMPANY-IIS-1 的服务器上托管的站点,必须发出以下命令来创建适当的 SPN:
setspn -s http/services.company.local COMPANY-IIS-1
(使用-s
代替链接文章所建议的-a
,因为它首先检查以确保spn 不存在)
调试该问题更具挑战性,需要使用安装在网络服务器上的 WireShark。我开始了数据包跟踪,然后尝试访问导致收到初始未授权错误的网页。然后我过滤了仅 kerberos 流量的数据包捕获。
从那里我能够看到 kerberos TGS-REQ 和产生的错误,结果是 S_PRINCIPAL_UNKNOWN 错误。通过查看此响应的详细信息,我能够看到正在使用的 SPN(下面以红色标出),这是为了使身份验证成功而需要如上所述创建的 SPN。
对于解决问题的分步过程,this article 证明非常有用。
最后,要查看与给定机器关联的所有 SPN,可以发出以下命令:
setspn -l [machine name]
例如
setspn -l COMPANY-IIS-1
【讨论】:
以上是关于与 FQDN 一起使用时,WCF TransportCredentialOnly 安全中断的主要内容,如果未能解决你的问题,请参考以下文章
尝试将 gSoap 与 WCF 和 WSHttpBinding 一起使用
WCF 未将所有内核与 Visual Studio 2010 负载测试一起使用