我有一个与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>
答案 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
希望这有帮助