我正在研究一個需要在雙跳方案中進行委派的項目。我們有一個桌面客戶端,使用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地址主機名。似乎沒有任何人類可讀的錯誤代碼或錯誤消息。有關在數據包中查找什麼的建議?
真相告訴我,我會採取網絡嗅探,看看有什麼失敗。 –
@Eric我應該尋找什麼信息?數據包是否包含有關錯誤消息和事件日誌中包含的信息? –
我會推理你會看到客戶先嚐試遏制並失敗。檢查失敗的性質......包括錯誤代碼......會很有趣。 –