[英]Why is kerberos defaulting to NTLM in WCF?
有一個簡單的WCF演示應用程序,有兩個控制台項目 - 主機和客戶端。 兩者都在我的機器上運行(贏7盒)。 我正在使用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無法信任服務器的身份,也不會傳輸客戶端身份。”
當我在IIS4,5和6開發團隊工作時,我們遇到了很多! 要使Curb起作用,您需要滿足以下條件:
1)雙方支持限制(所有支持的Windows版本支持Curb今天)
2)機器驗證到Active Directory
3)為服務器端點注冊的服務主體名稱(SPN)。 在“過去的好日子”中,您必須使用SetSPN.exe手動執行此操作。 SPN只是Curb將連接的端點; 它需要這些數據來支持相互認可。 大多數應用程序會為您調用approp API(DsWriteAccountSpn)
如果上述任何步驟都不成立,Windows 通常會默認為NTLM,而只提供客戶端身份驗證。
希望有所幫助! - 邁克爾
服務器是如何配置的? 在配置文件中是否有<authentication mode="Windows"/>
和<identity impersonate="true"/>
?
您可以通過配置文件中的身份驗證標記設置身份驗證模式:
<configuration>
<system.web>
<authentication mode="Windows" />
</system.web>
</configuration>
也許MSDN上的這個頁面 - 調試Windows身份驗證錯誤 - 幫助你弄清楚發生了什么 - 似乎在使用NTLM與Kerberos時相當棘手。
Fyi通過MSDN:netTcpBinding:默認綁定使用傳輸安全性和協商身份驗證。 此協商嘗試使用Kerberos,但如果這不起作用,它將退回並使用舊的NTLM協議 。 如果您在域環境中,Kerberos是一個很好的選擇; 為了使用它,您需要在域帳戶下運行您的服務和客戶端。 您還需要為服務配置服務主體名稱(SPN)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.