【问题标题】:WCF TransportCredentialOnly security breaks when used with FQDN与 FQDN 一起使用时,WCF TransportCredentialOnly 安全中断
【发布时间】: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.localhttp://web.company.local)。一旦我尝试通过 FQDN 调用 WCF 服务,我就会收到 401 uauthorized 并带有以下异常消息:

MessageSecurityException:HTTP 请求未经客户端授权 身份验证方案“协商”。收到的认证头 来自服务器的是“协商,NTLM”。

我尝试将 clientCredentialType 更改为 NTLM 并从 IIS 身份验证中删除协商提供程序(如另一个 SO 问题中所建议)但没有成功(相同的错误消息,只是从服务器收到的标头是“NTLM”而不是“协商,NTLM”。从其他研究看来,与为该站点创建的两个子域相关联的 SPN 可能存在问题,但我不确定 1. 如何检查这些域的 SPN,2. 什么SPN 应该是,并且 3. 如果考虑到我正在使用内核模式身份验证,这仍然相关。

【问题讨论】:

    标签: wcf-security


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 2011-04-29
      • 1970-01-01
      • 2012-07-05
      • 2011-01-11
      • 1970-01-01
      • 2014-02-04
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多