3

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

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

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

他们聘请了一位顾问,他发现 LDAP 查询正在端口 389 上进行。此端口已关闭,但通过 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>
4

2 回答 2

3

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

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

于 2013-11-12T21:43:59.393 回答
3

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

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

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

您可以尝试另一件事,它确实很糟糕,但它有效:

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

希望这可以帮助

于 2013-11-18T18:43:27.740 回答