WCF 的身份验证问题 - IP 与 FQDN



我有一个与WCF Web服务通信的WPF应用程序。

我的一个客户遇到了一个问题,如果我将终结点地址设置为 IP 地址,一切正常,但如果我使用完全限定的域名 (FQDN),则会引发安全异常。

他们有一个非常复杂的网络,客户端通过3G,通过Web代理和检查点防火墙与Web服务器进行通信。

他们聘请了一位顾问,该顾问发现端口 389 上正在发生 LDAP 查询。此端口已关闭,但通过 ip 的请求将忽略失败,并在域名请求引发异常时继续。

IP 请求和域名请求有什么区别?为什么一个工作而另一个失败?

引发的安全异常为:

HTTP 请求未经授权,客户端身份验证方案"协商"。从服务器收到的身份验证标头是"协商,NTLM"。

这是我的客户端配置设置:

    <binding 
      name="Windows_Binding" 
      closeTimeout="00:01:00" 
      openTimeout="00:01:00" 
      receiveTimeout="00:10:00" 
      sendTimeout="00:10:00" 
      allowCookies="false" 
      bypassProxyOnLocal="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="2147483647"
      maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" 
      messageEncoding="Text" 
      textEncoding="utf-8" 
      transferMode="Buffered" 
      useDefaultWebProxy="true">
      <readerQuotas 
        maxDepth="2147483647" 
        maxStringContentLength="2147483647" 
        maxArrayLength="2147483647" 
        maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647"/>
      <security 
        mode="Transport">
        <transport 
          clientCredentialType="Windows" 
          proxyCredentialType="None" 
          realm=""/>
        <message 
          clientCredentialType="UserName" 
          algorithmSuite="Default"/>
      </security>
    </binding>

你能发布服务器绑定吗?

这是使用 Windows 安全中心时 WCF 安全性中相当常见的错误。要检查的几件事

检查 Web 服务器是否创建了正确的 SPN,因为它按 IP 地址工作,而通过 FQDN 失败,这可能意味着您没有 FQDN 的 SPN(常见情况),而且,IIS 上的同一 IP 地址可能有多个主机标头。

你可以尝试的另一件事,它真的很糟糕,但它有效:

将绑定配置更改为使用 CredentialType="Ntlm",并在 IIS 上转到集成身份验证、提供程序并删除协商并仅保留 NTLM

希望这有帮助

基本上有两种不同的协议可用于Windows身份验证:更现代的Kerberos和传统的NTLMv2。虽然 Kerberos 更现代,但它需要更多的元数据才能工作。NTLMv2 要简单得多。

一个猜测(实际上只是一个猜测)是使用 IP 地址使用 NTLMv2 协议,该协议无需在该 LDAP 查询中查询的其他信息即可工作。使用域名 Kerberos,当没有连接到 LDAP(Active Directory?)服务器时会失败。

最新更新