2012-09-14 52 views
0

我正在研究一個需要在雙跳方案中進行委派的項目。我們有一個桌面客戶端,使用net.tcp綁定連接到WCF服務,連接到另一臺服務器上的SQL數據庫。我們的目標是使用用戶的憑據來訪問SQL數據庫。WCF中的委派不工作 - 第一跳是NTLM?

WCF服務和SQL數據庫都在相同的域用戶下運行,該用戶爲SQL數據庫啓用了委派。已遵循指示here,但沒有成功。

現在,我們的日誌中記錄了一些詳細信息: SQL數據庫上使用的登錄名顯示爲運行WCF服務的用戶,並使用Kerberos。 WCF服務器上使用的登錄名顯示爲客戶端的用戶,但使用NTLM。 使用[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())會導致在WCF服務器上作爲客戶端運行命令。這使我相信模擬工作正常。

那麼,什麼可能導致第一跳回到NTLM?我們懷疑這是SPN問題,但我們已將WCF服務和SQL服務的SPN註冊到共享域用戶。另外,按照上面列出的說明,我們已將SQL服務設置爲域用戶的委派委託。

我們在WCF服務上使用了EndpointIdentity.CreateSpnIdentity來設置SPN,這是我們向域用戶註冊的SPN。

有什麼建議嗎?提前致謝!

編輯: 我們發現了一些可能存在的問題 - 我們沒有在客戶端上使用EndpointIdentity.CreateSpnIdentity。設置完成後,我們收到錯誤 「調用SSPI失敗」,內部異常爲「目標原則名稱不正確」。但是我們在客戶端和服務器中設置的SPN匹配,並且都與服務的主機名匹配。如果我們將客戶端和服務器SPN都設置爲完全不同的東西,或者如果客戶端的指定SPN與服務器的SPN不匹配,則認證會像以前一樣回退到NTLM。我們已經對錯誤進行了研究,但找不到原因。有什麼建議麼?

我們還執行了兩種情況下的數據包捕獲 - 回退到NTLM並收到「SSPI調用失敗」錯誤。在這兩種情況下,都會發送和接收類似的數據包,直到一個NTLM被提及。另一方面,「TURN CHANNEL」數據包從客戶端發送到服務器。除非提到NTLM,並且發送用戶名和計算機名稱,或者發送「TURN CHANNEL」數據包,該數據包包含似乎是SPN的數據包,並且可能還包含該服務器的IP地址主機名。似乎沒有任何人類可讀的錯誤代碼或錯誤消息。有關在數據包中查找什麼的建議?

+0

真相告訴我,我會採取網絡嗅探,看看有什麼失敗。 –

+0

@Eric我應該尋找什麼信息?數據包是否包含有關錯誤消息和事件日誌中包含的信息? –

+0

我會推理你會看到客戶先嚐試遏制並失敗。檢查失敗的性質......包括錯誤代碼......會很有趣。 –

回答

0

我們發現我們的錯誤 - 客戶端正在使用服務器的IP地址創建連接。將IP切換到完全限定的域名後,第一跳始終使用Kerberos進行身份驗證。

IP地址解析爲我們在兩個SPN中使用的相同字符串,但我想客戶端在執行任何其他檢查之前檢查連接字符串是否與斜槓後面的SPN部分匹配。

我們使用網絡服務和我們的域用戶測試了我們的結果,只要SPN分別註冊到計算機或用戶,就沒有問題。

希望這個答案能夠爲別人節省一些時間和麻煩!


附加說明:雖然這使Kerberos身份驗證的所有連接,我們後來發現,這是在我們的情況是不必要的。我們與數據庫的部分連接不在使用模塊的模擬中,導致表讀取失敗。此後,我們刪除了與代理和SPN相關的所有代碼,並且數據庫連接繼續正常工作。我們的第一跳是使用NTLM。我們並不完全確定憑證如何在SQL服務器上使用,因爲我們的連接看起來像是雙跳場景,它應該需要Kerberos和委派,但很難與任何工作爭論。我懷疑它可能有一些做與位於下代表團this document注:

當客戶端使用對應於Windows帳戶的後臺用戶名和密碼驗證到前端服務服務,前端服務可以通過重用客戶端的用戶名和密碼來驗證後端服務。這是身份流的一種特別強大的形式,因爲將用戶名和密碼傳遞給後端服務可使後端服務執行模擬,但由於未使用Kerberos,因此它不構成委派。有關委派的Active Directory控件不適用於用戶名和密碼身份驗證。

如果任何人有任何其他建議,因爲它的工作原理,我很樂意聽到他們。但是,我不認爲值得再提一個問題。