与FQDN一起使用时,WCF TransportCredentialOnly安全性中断

时间:2014-10-21 20:03:52

标签: wcf-security

在同一个仅限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.localhttp://web.company.local)。一旦我尝试通过FQDN调用WCF服务,我就会收到一个401 uauthorized,其中包含以下异常消息:

  

MessageSecurityException:HTTP请求未经授权与客户端   认证方案&#39;谈判&#39;。收到身份验证标头   来自服务器的是#Negotiate,NTLM&#39;。

我尝试将clientCredentialType更改为NTLM并从IIS身份验证中移除协商提供程序(如另一个SO问题所示)但没有成功(相同的错误消息,只是从服务器收到的标题是&#34 ; NTLM&#34;而不是&#34; Negotiate,NTLM&#34;。从其他研究来看,它可能是与为该网站创建的两个子域相关联的SPN的问题,但我不确定1如何检查这些域的SPN,2。SPN应该是什么,以及3.如果我使用内核模式authnetcation,这甚至仍然相关。

1 个答案:

答案 0 :(得分:0)

问题确实是缺少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尚不存在)


调试问题更具挑战性,需要在Web服务器盒上安装WireShark。我开始数据包跟踪然后尝试访问导致初始未授权错误的网页。然后,我只过滤了kerberos流量的数据包捕获。

从那里我能够看到kerberos TGS-REQ和结果错误,结果是S_PRINCIPAL_UNKNOWN错误。通过查看此响应的详细信息,我能够看到正在使用的SPN(下面以红色标出),这是需要如上所述创建的SPN,以便验证成功。

对于问题排查的分步过程,this article非常有用。

S_PRINCIPAL_UNKNOWN response in a WireShark packet capture


最后,要查看与给定计算机关联的所有SPN,可以发出以下命令:

setspn -l [machine name]

e.g。

setspn -l COMPANY-IIS-1