与 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 负载测试一起使用

如何将基于套接字的客户端与 WCF (net.tcp) 服务一起使用?

无法让 Ninject 拦截与 WCF 一起使用

将 WCF 服务与实体框架 4 和...DTO 一起使用?

无法让 JSONP 与 WCF 数据服务一起使用