Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么kerberos在WCF中默认为NTLM?_Wcf_Security_Authentication_Kerberos_Ntlm - Fatal编程技术网

为什么kerberos在WCF中默认为NTLM?

为什么kerberos在WCF中默认为NTLM?,wcf,security,authentication,kerberos,ntlm,Wcf,Security,Authentication,Kerberos,Ntlm,有一个简单的WCF演示应用程序,它有两个控制台项目——主机和客户端。两个都在我的机器上运行(赢7盒)。我正在使用netTcpBinding,它使用windows身份验证 问题是身份验证正在从kerberos降级到NTLM,我不知道为什么。 如果我使用 <clientCredentials> <windows allowNtlm="true" /> </clientCredentials> 我不知道这为什么能解决这个问题。好的,现在在客户端,我完全信任服

有一个简单的WCF演示应用程序,它有两个控制台项目——主机和客户端。两个都在我的机器上运行(赢7盒)。我正在使用netTcpBinding,它使用windows身份验证

问题是身份验证正在从kerberos降级到NTLM,我不知道为什么。

如果我使用

<clientCredentials>
   <windows allowNtlm="true" />
</clientCredentials>
我不知道这为什么能解决这个问题。好的,现在在客户端,我完全信任服务器(嘿,我认识那个家伙!)。但既然NTLM不如kerberos安全,为什么不反过来呢?如果我不完全信任服务器,我就使用kerberos,否则ntlm就可以了


或者,OTOH,如果我不完全信任服务器,为什么它能工作?“SecurityException:未设置端点标识。WCF不能信任服务器的标识,也不会传输客户端标识。”

服务器是如何配置的?配置文件中是否有

您可以通过配置文件中的身份验证标记设置身份验证模式:

<configuration>
  <system.web>
    <authentication mode="Windows" />
  </system.web>
</configuration>

也许MSDN上的这一页--帮助您了解发生了什么事--似乎在使用NTLM与Kerberos时相当棘手。

通过MSDN供您参考:
netTcpBinding:默认绑定使用具有协商身份验证的传输安全性此协商尝试使用Kerberos,但如果不起作用,它将退回并使用较旧的NTLM协议。如果您在域环境中,Kerberos是一个很好的选择;为了使用它,您需要在域帐户下运行服务和客户端。您还需要为您的服务配置服务主体名称(SPN)。

当我在IIS4、5和6开发团队工作时,我们经常遇到这种情况!要使路缘石正常工作,需要满足以下条件:

1) 双方都支持路缘(目前所有受支持的Windows版本都支持路缘)

2) 计算机对Active Directory的身份验证

3) 为服务器终结点注册的服务主体名称(SPN)。在“过去的好日子”中,您必须使用SetSPN.exe手动执行此操作。SPN只是路缘石将连接到的端点;它需要这些数据来支持相互身份验证。大多数应用程序都会调用approp API来为您执行此操作(DsWriteAccountSpn)

如果上述任何一个步骤都不正确,Windows通常默认为NTLM,whcih只提供客户端身份验证

希望有帮助!
-Michael

我认为这些只适用于http绑定。但是,我将我的clientCredentialType指定为Windows。同样,如果客户端允许ntlm,它就可以工作,否则就会失败(我认为,这意味着kerberos不可用)。恐怕它们不仅适用于http。我看不到与tcp有关的任何身份验证模式。然而,我也没有看到身份,这就是最终的解决方案。在tcp绑定中,您是否设置了身份验证模式(在xml中,而不是在代码kthx中)?这是一个控制台应用程序;我不认为我如何登录一个网站与我的经历有多大关系。。。两端的域用户,请检查。完全限定的URL,已更新,没有差异。添加标识/UPN。。。没有区别。正在客户端上配置SPN标识。。。宾果@威尔:酷,我只是想建议您检查服务器和客户端上的SPN。这似乎是serverfault.com的一个问题。重新列出的解决方案:Kerberos更安全正是因为这个原因——服务器是一个受信任的已知源,在地址和在该地址运行的进程方面都有一个有保证的标识。以其他用户身份运行的服务帐户将无法处理您的请求。@hogan我认为kerb/ntlm更多的是身份验证,而不是授权。让我使用kerb对任何服务器进行身份验证;一旦我知道服务是谁,我就可以决定是否与他们打交道。如果我通过kerb认证,我就拥有受信任的第三方(AD)提供的服务的身份。如果该服务被欺骗,我可以通过该标识来判断,如果不是预期的,则抛出异常。在WCF中,被欺骗的服务器似乎会在路缘发生故障,然后通过ntlm。这对我来说似乎不安全。与任何人进行身份验证,如果他们不是我所期望的人,则抛出。当然听起来不错,但这不是它的实现方式。因此,从理论上讲,在阅读了我最初没有阅读的您的评论后,这种行为似乎是出于设计。我读过一两本关于windows安全性的书,有时仍然令人困惑。我不明白WCF是如何处理相互身份验证的,所以这让它变得更加困难。为什么我必须提供服务器UPN/SPN/DNS才能在客户端上启用kerb?如果我不完全信任服务器,为什么ntlm比kerb好?或者客户是否需要向第三方提供服务标识?为什么服务不能直接提供呢?为什么我头疼?Kerb需要验证客户端和服务器,我指的是计算机。当你的客户端代码(WCF)请求连接到一个服务时,它需要确切地知道它连接到什么,因此管理员需要将服务器应用程序的SPN添加到广告中-本质上你是在对Kerb说“我需要连接到这个SPN”。在许多情况下,等式的服务器端将重新注册SPN,但前提是它有能力这样做。NTLM并不比Kerb好,NTLM只对客户端进行身份验证,因此服务器知道您是谁,但您不知道您连接的是谁。此外:kerberos只能在通过DNS名称调用服务时使用。通过IP地址调用服务将导致使用NTLM
<configuration>
  <system.web>
    <authentication mode="Windows" />
  </system.web>
</configuration>