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

时间:2013-11-07 01:54:44

标签: c# wcf

我有一个与WCF网络服务对话的WPF应用程序。

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

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

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

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

抛出的安全异常是:

HTTP请求未经授权,客户端身份验证方案为“Negotiate”。从服务器收到的身份验证标头是“Negotiate,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>

2 个答案:

答案 0 :(得分:3)

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

猜测(实际上只是猜测)是使用IP地址,使用NTLMv2协议,该协议无需在该LDAP查询中查询的附加信息。使用域名Kerberos时,如果没有与LDAP(Active Directory?)服务器的连接,则会失败。

答案 1 :(得分:3)

你可以发布服务器绑定吗?

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

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

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

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

希望这有帮助