7 security authentication wcf ntlm kerberos
有一个简单的WCF演示应用程序,有两个控制台项目 - 主机和客户端.两者都在我的机器上运行(赢7盒).我正在使用netTcpBinding,它使用Windows身份验证.
问题是认证从kerberos降级到NTLM,我无法弄清楚原因.
如果我使用
<clientCredentials>
<windows allowNtlm="true" />
</clientCredentials>
Run Code Online (Sandbox Code Playgroud)
在客户端,一切都很酷.但如果我改变它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>
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这会解决这个问题.好的,现在在客户端我完全信任服务器(嘿,我知道那个人!).但由于NTLM不如kerberos安全,为什么不相反呢?如果我不完全信任服务器,我使用kerberos,否则ntlm很好.
或者,OTOH,如果我不完全信任服务器,为什么它可以工作?"SecurityException:未设置端点标识.WCF无法信任服务器的身份,也不会传输客户端身份."
当我在IIS4,5和6开发团队工作时,我们遇到了很多!要使Curb起作用,您需要满足以下条件:
1)双方支持限制(所有支持的Windows版本支持Curb今天)
2)机器验证到Active Directory
3)为服务器端点注册的服务主体名称(SPN).在"过去的好日子"中,您必须使用SetSPN.exe手动执行此操作.SPN只是Curb将连接的端点; 它需要这些数据来支持相互认可.大多数应用程序会为您调用approp API(DsWriteAccountSpn)
如果上述任何步骤都不成立,Windows 通常会默认为NTLM,而只提供客户端身份验证.
希望有所帮助! - 迈克尔
归档时间: |
|
查看次数: |
9486 次 |
最近记录: |