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

时间:2010-02-23 14:50:20

标签: wcf security authentication kerberos ntlm

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

问题是身份验证从kerberos降级到NTLM,我无法弄清楚原因。

如果我使用

<clientCredentials>
   <windows allowNtlm="true" />
</clientCredentials>

在客户端,一切都很酷。但如果我将其更改为false,则会出现以下异常:

  

SecurityNegotiationException:The   远程服务器不满足   相互认证要求。

这表明kerberos失败,并且由于客户端不允许NTLM,因此调用会导致抛出异常。

这是项目的问题,还是由我的开发机器配置引起的外部问题?


解决方案:

显然,我必须在客户端配置中指定服务器的标识。在我的情况下,服务器以我的身份运行,所以我这样修改了客户端:

<client>
  <endpoint address="net.tcp://dev7.HurrDurr.com:12345/MyService" 
            binding="netTcpBinding" 
            bindingConfiguration="MyBindingConfigurationLol" 
            behaviorConfiguration="HurrDurrServiceEndpoint" 
            contract="ShaolinCore.ICommunicationService">
    <!-- start changes here -->
    <identity>
      <userPrincipalName value="myusername@mydomain"/>
    </identity>
    <!-- end changes here -->
  </endpoint>
</client>

我不确定为什么这会解决这个问题。好的,现在在客户端我完全信任服务器(嘿,我知道那个人!)。但由于NTLM不如kerberos安全,为什么不相反呢?如果我不完全信任服务器,我使用kerberos,否则ntlm很好。

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

4 个答案:

答案 0 :(得分:7)

当我在IIS4,5和6开发团队工作时,我们遇到了很多!要使Curb起作用,您需要满足以下条件:

1)双方都支持限制(今天所有支持的Windows版本支持Curb)

2)机器验证到Active Directory

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

如果上述任何步骤都不成立,Windows 通常默认为NTLM,而且只提供客户端身份验证。

希望有所帮助! - 迈克尔

答案 1 :(得分:1)

如何配置服务器?您是否在配置文件中有<authentication mode="Windows"/><identity impersonate="true"/>

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

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

答案 2 :(得分:1)

也许MSDN上的这个页面 - Debugging Windows Authentication Errors - 帮助你弄清楚发生了什么 - 似乎在使用NTLM与Kerberos时相当棘手。

答案 3 :(得分:1)

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