【发布时间】:2011-01-20 02:41:53
【问题描述】:
有一个简单的 WCF 演示应用程序,它有两个控制台项目——主机和客户端。两者都在我的机器上运行(win 7 box)。我正在使用 netTcpBinding,它使用 Windows 身份验证。
问题是身份验证从 kerberos 降级到 NTLM,我不知道为什么。
如果我使用
<clientCredentials>
<windows allowNtlm="true" />
</clientCredentials>
在客户端,一切都很酷。但是,如果我将其更改为 false,则会出现以下异常:
SecurityNegotiationException: 远程服务器不满足 相互身份验证要求。
这表明 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 无法信任服务器的身份,不会传输客户端身份。”
【问题讨论】:
-
这似乎是 serverfault.com 的问题。
-
重新列出的解决方案:正是由于这个原因,Kerberos 更加安全——服务器是一个受信任且已知的来源,在地址 和 进程运行时都具有保证的身份那个地址。以其他用户身份运行的服务帐户将无法处理您的请求。
-
@hogan 我认为 kerb/ntlm 更多的是关于身份验证而不是授权。让我使用 kerb 向任何服务器进行身份验证;一旦我知道服务是谁,我就可以决定是否要与他们打交道。如果我使用遏制进行身份验证,则我拥有受信任的第三方 (AD) 提供的服务的身份。如果服务被欺骗,我可以通过该身份来判断,如果不是预期的,则抛出异常。在 WCF 中,欺骗服务器似乎会失败,然后通过 ntlm。这对我来说似乎并不安全。与任何人进行身份验证,如果他们不是我所期望的,就扔掉。
-
听起来不错,但这不是它的实现方式。
标签: wcf security authentication kerberos ntlm