有一个简单的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无法信任服务器的身份,也不会传输客户端身份。”
答案 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)。