我先簡單的介紹一下我的需求。我希望我做的軟件中,可以與域控集成,實現單點登錄,且不需要額外輸入帳號祕密。當然這是在已經登陸到域的前提下。
爲此我翻過很多資料。Windows 確實提供了 API 來操作登錄。但小弟比較愚笨,一直感覺這些 API 使用起來很笨拙。且根據系統需求,往往進行域控帳號認證,都是在服務器上進行的。因爲你的機器可能不能訪問到我的域控服務器。對於一般的 IT 服務器部署,域控服務器都是在一個安全區域裏面的。
在此之前,我已經實現了一個WebService ,提供了一個 Login(UserName, Password) 的方法, Login 可以在域控上進行認證。但這個方法必須在客戶端自己做一個登陸窗體。
一次偶然的機會,我發現,如果在Webservice 的 IIS 上設置了 NT 集成用戶認證,那麼在非域環境中登陸的時候,是會自動彈出一個登陸密碼的框框的。其實這點我早就應該知道了,只是以前都是在網頁中彈出的,沒想到在 C/S 環境中也會自動彈出,根據這一個發現,我設計了一個簡單的 SSO 登陸方式:
首先,實現一個Webservice ,我選用的 C# 實現的,微軟這點還是做得非常易用的。這個 Service ,只需要提供一個方法:
public string GetUserName() { return User.Identity.Isauthorized?User.Identity.Name:""; }
實現也很簡單,就從當前認證的用戶信息中獲取用戶的名字就可以了。
然後,發佈這個服務,並在IIS 中設置賬戶的安全信息是集成 NT 域控認證,同時取消匿名訪問。
這樣就可以,現在你只需要在你的應用中,在剛開始初始化的時候,調用一下這個WebServie, 如果獲取的賬號名不爲空,就表示賬戶已經在域控進行認證了。
關鍵是,這個方法可以讓你在很多地方進行復用,使用也很簡單。不過前提必須是網絡應用。那種單機應用就不怎麼適合了。