使用Kerberos解決身份憑據傳遞問題

  上一篇文章提到了我在開發顯示Exchange未讀郵件數的WebPart中遇到了身份憑據傳遞的問題。因爲Exchange的WebDAV是根據不同的用戶返回不同郵箱的數據,當然就是非匿名的。輸入身份信息一種方法是在網頁上放置一個輸入用戶名和密碼的Form,這樣構建的NetworkCredential不存在傳遞的問題。但是,由於我的網絡是基於Windows域方式的,每個用戶要登錄到域中,因此使用Windows集成身份驗證能夠讓用戶在SharePoint中使用當前的身份憑據登錄,這樣比輸入用戶名密碼更加方便和友好。也就是說,爲了免去用戶再次輸入Exchange用戶名和密碼,需要把客戶端當前登錄的Credential(用戶身份憑據)傳遞到Exchange服務器上。然而,我的Exchange服務器和SharePoint網站服務器是兩臺不同的服務器,如果要使用集成身份驗證並使用Windows和SharePoint默認的NTLM身份驗證協議是無法將當前HttpContext中的身份憑據從Web服務器傳遞到Exchange服務器上的。而且也不可能從當前的身份憑據中獲得用戶名和密碼,所以也不可能自己構建一個可傳遞的NetworkCredential。這就是著名的“Double Hop”雙跳問題。

  當然解決這個問題有很多方法,比如可以用到SharePoint的單點登錄Single-Sign-On(SSO)。但是每個用戶需要在第一次使用之前先輸入一次自己的Exchange密碼儲存到SSO數據庫中,而且如果更改了Exchange密碼需要再同時修改SSO數據,也比較麻煩。所以最好的解決方案就是使用Kerberos身份驗證協議代替NTLM身份驗證協議。

NTLM身份驗證協議之所以無法傳遞身份憑據是由該協議本身的限制決定的,下圖解釋了原因。

http://www.felixwoo.com/wp-content/uploads/attachments/200606/20_233404_ntlm.jpg
  其實說“身份憑據傳遞”是不太恰當的,實際上是讓Web服務器賬戶模擬客戶端的用戶來再對Exchange服務器發送請求。從上圖中我們可以看到NTLM協議無法讓Web服務器模擬客戶端,因此Exchange收到的是一個未知用戶的請求,所以會返回401身份驗證錯誤。

  在這種情況下只能使用Kerberos協議,因爲該協議最重要的特性之一就是可以委派。也就是說Web服務器可以模擬客戶端對Exchange服務器發送請求。如下圖所示。

http://www.felixwoo.com/wp-content/uploads/attachments/200606/20_234626_kerberos.jpg

  另外,爲了增加安全性,Windows Server 2003中還爲Kerberos增加了約束委派特性。可以指定委派的服務,那麼沒有指定的服務將無法使用委派。如下圖所示。

http://www.felixwoo.com/wp-content/uploads/attachments/200606/20_235759_kerberos2.jpg

那麼,如何啓用Kerberos身份驗證代替NTLM呢?步驟如下:

一、以SharePoint爲例,首先要修改IIS的配置文件以啓用Kerberos驗證。
如果安裝了SPS SP2以後則可以不用手動修改IIS配置文件,在SPS創建網站的時候就會有身份驗證協議的選項。

二、爲Web服務運行的帳號配置服務主體名稱(SPN)
一般SPS的服務都是以一個域用戶身份運行的,那麼應該爲該用戶設置SPN。

三、爲Web服務器運行的帳號配置委派信任關係
該步驟一定要設置爲約束委派,我之前一直試驗用非約束委派結果一直失敗。

爲SPS啓用Kerberos身份驗證的具體方法和說明可參考http://support.microsoft.com/default.aspx?scid=kb;zh-CN;832769

以上爲我的案例中的步驟,不同情況配置情況不盡相同。在配置Kerberos委派的過程中有幾個關鍵點。

1、IIS要設置爲Windows集成驗證
2、一定要確定客戶端使用的是Kerberos身份驗證協議,這個可以通過抓包軟件或者Kerberos Tray來監視。注:Kerberos使用88端口。
3、如果Web服務是基於本地系統或者網絡服務的則無需設置SPN,否則一定要爲域用戶設置SPN。
4、如果Web服務是基於本地系統或者網絡服務的則要在Active Directory中爲該Web服務的這臺計算機設置委派信任關係,否則要爲Web服務所基於的域用戶設置委派信任關係,而且一定要設置成爲約束委派!
5、Web.config中要有<authentication mode="Windows" />和<identity impersonate="true" />

  更詳細的信息、設置方法和故障排除方法可以參考http://www.microsoft.com/china/technet/prodtechnol/windowsserver2003/technologies/security/tkerbdel.mspx 。這篇文章雖然有點長不過可謂字字珠璣,我就是在認真研讀後才最終解決我的問題的。

發佈了32 篇原創文章 · 獲贊 3 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章