林為偉
(福建師范大學(xué)福清分校,福建 福清 350300)
Windows應(yīng)用單點(diǎn)登錄系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
林為偉
(福建師范大學(xué)福清分校,福建 福清 350300)
本文涉及的SSO系統(tǒng)克服了傳統(tǒng)SSO系統(tǒng)的缺點(diǎn),對(duì)應(yīng)用系統(tǒng)登陸過(guò)程進(jìn)行了分離解析,采集提取了W indows應(yīng)用程序的界面中應(yīng)該有共性信息,即用戶(hù)登錄的時(shí)候?qū)⒂脩?hù)的用戶(hù)名、密碼信息和不同的窗體的句柄的坐標(biāo)位置信息,并選擇調(diào)用相應(yīng)的系統(tǒng)API函數(shù),形成一個(gè)W indows消息隊(duì)列來(lái)記錄下用戶(hù)登錄的過(guò)程,實(shí)現(xiàn)了W indows應(yīng)用系統(tǒng)的單點(diǎn)自動(dòng)登錄,實(shí)際使用效果良好.
SSO;模擬自動(dòng)登錄;W indows消息機(jī)制;w indows窗體結(jié)構(gòu)
進(jìn)入新世紀(jì)以來(lái),人類(lèi)獲得了快速的發(fā)展.在追求辦事效率的情況下,人們對(duì)信息化的建設(shè)也是越來(lái)越加重視.經(jīng)過(guò)多年的發(fā)展與國(guó)家對(duì)信息化建設(shè)的重視以及投入之下,現(xiàn)在信息化建設(shè)更加趨于完善.信息化對(duì)大家來(lái)說(shuō)并不是一個(gè)陌生的詞語(yǔ),它存在于人們應(yīng)用的各種系統(tǒng)之中,其中就包括:辦公系統(tǒng)、財(cái)務(wù)系統(tǒng)、人事管理系統(tǒng)、圖書(shū)管理系統(tǒng)等等.當(dāng)然,任何事物都有兩面性.一個(gè)好的應(yīng)用系統(tǒng)可能會(huì)對(duì)人們帶來(lái)很大的便利,可是,應(yīng)用系統(tǒng)多了以后用戶(hù)需要記憶的用戶(hù)名以及密碼也是越來(lái)越多,這也就造成了不便,用戶(hù)也會(huì)感覺(jué)很繁瑣.如果在登錄系統(tǒng)的時(shí)候用戶(hù)名或者密碼記憶出錯(cuò)的話很容易讓用戶(hù)反感.同時(shí),用戶(hù)名與密碼的安全也是很重要的,不同的應(yīng)用系統(tǒng)安全性可能不同,導(dǎo)致一些安全性較差的應(yīng)用系統(tǒng)泄漏用戶(hù)的個(gè)人信息.本文就是要尋找一種解決方案,盡可能讓用戶(hù)一次性登錄,沒(méi)有那么多的用戶(hù)名以及密碼.于是,我們應(yīng)用到了SSO[1](Single Sign On,單點(diǎn)登錄)技術(shù),一次登錄就可以訪問(wèn)多個(gè)系統(tǒng)而不要重復(fù)性登錄.這樣不僅讓用戶(hù)的個(gè)人信息安全了也讓用戶(hù)不再感覺(jué)那么繁瑣,大大提供了現(xiàn)代企事業(yè)的信息化水平.
SSO技術(shù)在現(xiàn)代企業(yè)應(yīng)用系統(tǒng)之中是比較流行的,它主要通過(guò)一次登錄實(shí)現(xiàn)訪問(wèn)所有的可信任的應(yīng)用系統(tǒng).SSO技術(shù)可以將本次登錄的信息映射到其它應(yīng)用系統(tǒng)之中,從而實(shí)現(xiàn)免登錄的效果.然而,SSO技術(shù)實(shí)現(xiàn)的前提就是不同的應(yīng)用系統(tǒng)之間要有一個(gè)共同的認(rèn)證系統(tǒng),這樣才能保證單點(diǎn)登錄的效果.
實(shí)現(xiàn)傳統(tǒng)SSO技術(shù)來(lái)完成的一個(gè)典型代表就是使用Kerberos協(xié)議[2],Kerberos協(xié)議(一種網(wǎng)絡(luò)認(rèn)證協(xié)議)采用票據(jù)來(lái)訪問(wèn)目標(biāo)系統(tǒng),它采用C/S結(jié)構(gòu),能夠?qū)崿F(xiàn)相互認(rèn)證,同時(shí)在目前的企事業(yè)應(yīng)用系統(tǒng)當(dāng)中這種技術(shù)也是比較流行的.隨著信息化技術(shù)的快速發(fā)展與整合,很多企業(yè)也在應(yīng)用統(tǒng)一的SSO技術(shù),如IBM的WebSphere和Microsoft的. NET Passport[3].
傳統(tǒng)的SSO方案會(huì)有一些局限性,舉個(gè)例子來(lái)說(shuō):傳統(tǒng)的SSO解決方案只能支持WEB應(yīng)用系統(tǒng),而對(duì)如今大家應(yīng)用比較廣泛的Windows應(yīng)用系統(tǒng)來(lái)說(shuō)并不支持,這樣的話導(dǎo)致用戶(hù)在應(yīng)用SSO系統(tǒng)是必須應(yīng)用傳統(tǒng)的SSO方案所提供的API或者Agent才行,這樣就造成了很大的局限性.
2.1 系統(tǒng)設(shè)計(jì)思想
既然傳統(tǒng)的SSO技術(shù)有局限性以及缺點(diǎn),那么我們?cè)谠O(shè)計(jì)新的系統(tǒng)的時(shí)候就需要考慮到這點(diǎn),克服其缺點(diǎn).新的SSO系統(tǒng)的設(shè)計(jì)思想就是:首先,要克服最大的局限性及應(yīng)用系統(tǒng)支持的單一性.因此,新的業(yè)務(wù)系統(tǒng)不僅支持Web應(yīng)用系統(tǒng)而且還要支持Windows應(yīng)用系統(tǒng),這樣的SSO系統(tǒng)才能被廣大用戶(hù)所接受.其次,將傳統(tǒng)意義上的單點(diǎn)登錄技術(shù)發(fā)展為自動(dòng)登錄技術(shù).這樣的話用戶(hù)也就不用記憶自己的用戶(hù)名和密碼,點(diǎn)擊自動(dòng)登錄即可.整個(gè)登錄對(duì)用戶(hù)透明[4].
新的SSO系統(tǒng)支持Windows應(yīng)用系統(tǒng),因此開(kāi)發(fā)人員在部署的過(guò)程中不需要對(duì)原有的應(yīng)用系統(tǒng)進(jìn)行更改,提高了開(kāi)發(fā)人員的部署速度.全新設(shè)計(jì)的SSO系統(tǒng)其用戶(hù)名以及密碼在第一次登錄之后就將其信息存入服務(wù)器的數(shù)據(jù)庫(kù)之中.當(dāng)SSO系統(tǒng)首次進(jìn)行部署的時(shí)候就會(huì)在每個(gè)應(yīng)用系統(tǒng)中進(jìn)行采集配置,從而產(chǎn)生一個(gè)配置文件,然后將這個(gè)配置文件保存到相應(yīng)的數(shù)據(jù)庫(kù)當(dāng)中.當(dāng)用戶(hù)在單點(diǎn)登錄時(shí)就會(huì)通過(guò)配置文件進(jìn)行驗(yàn)證登錄.
2.2 SSO系統(tǒng)的總體架構(gòu)
針對(duì)以上的系統(tǒng)設(shè)計(jì)思想,本系統(tǒng)的軟件架構(gòu)如圖1所示.
圖1 系統(tǒng)軟件架構(gòu)圖
Windows應(yīng)用系統(tǒng)作為當(dāng)今的主流系統(tǒng)深受用戶(hù)的喜愛(ài),它操作簡(jiǎn)單,界面友好、人性化,而且很多辦公軟件是建立在Windows操作系統(tǒng)的基礎(chǔ)之上的.現(xiàn)在的Windows操作系統(tǒng)的應(yīng)用界面都是由多窗體組成的,操作系統(tǒng)在運(yùn)行的時(shí)候都會(huì)給不同的窗體分配不同的句柄,這樣SSO系統(tǒng)在運(yùn)行的時(shí)候我們就可以根據(jù)應(yīng)用系統(tǒng)所對(duì)應(yīng)分配的句柄來(lái)發(fā)送消息,以此來(lái)達(dá)到控制不同消息窗體的目的.
單點(diǎn)登錄系統(tǒng)分析采集了Windows應(yīng)用程序的界面中應(yīng)該有共性信息,然后在登錄的時(shí)候?qū)⒂脩?hù)的用戶(hù)名、密碼以及不同的窗體的句柄進(jìn)行收集,然后將這些信息保存到數(shù)據(jù)庫(kù)當(dāng)中.用戶(hù)下次再次登錄的時(shí)候就可以從數(shù)據(jù)庫(kù)當(dāng)中進(jìn)行調(diào)用然后與所輸入的用戶(hù)名密碼進(jìn)行校驗(yàn).
單點(diǎn)登錄系統(tǒng)的原理其實(shí)很簡(jiǎn)單,它在登錄的時(shí)候需要對(duì)Windows應(yīng)用系統(tǒng)的窗體結(jié)構(gòu)進(jìn)行分析處理,這樣記錄下所要進(jìn)行發(fā)送的消息.具體登錄過(guò)程如圖2所示:
圖2 典型的Windows應(yīng)用系統(tǒng)自動(dòng)登錄過(guò)程
4.1.NET中使用系統(tǒng)API函數(shù)
新的SSO系統(tǒng)在設(shè)計(jì)的過(guò)程中調(diào)用了許多API函數(shù),這樣在應(yīng)用的過(guò)程中直接進(jìn)行調(diào)用就可以了.但是,另一方面,.net類(lèi)庫(kù)在對(duì)API函數(shù)的封裝并不完整,因此需要一個(gè)統(tǒng)一的調(diào)用格式.
在進(jìn)行調(diào)用的過(guò)程中為了調(diào)用的靈活性可以將所有調(diào)用的API函數(shù)統(tǒng)一封裝到類(lèi)Api.cs之中.這樣的話,下次再進(jìn)行調(diào)用的時(shí)候就不用重復(fù)以上代碼了,直接調(diào)用API.cs類(lèi)就可以了.
4.2 針對(duì)不同Windows應(yīng)用系統(tǒng)進(jìn)行分類(lèi)
本系統(tǒng)在進(jìn)行設(shè)計(jì)的過(guò)程中針對(duì)的是Windows應(yīng)用系統(tǒng),首先將不同的應(yīng)用系統(tǒng)進(jìn)行了分類(lèi),以便后續(xù)系統(tǒng)的設(shè)計(jì).將如今的Windows應(yīng)用系統(tǒng)分成了兩類(lèi):“通用型”以及“專(zhuān)用型”.所謂的通用型應(yīng)用系統(tǒng)是指那些應(yīng)用系統(tǒng)的界面比較統(tǒng)一,輸入框、表格以及按鈕比較單一,因此可以將這些分成“通用型”.
有些應(yīng)用系統(tǒng)的界面比較復(fù)雜,比如說(shuō)QQ,WPF等應(yīng)用系統(tǒng)的界面,他們的輸入框等并不是窗體,因此將這些分成“專(zhuān)用型”.
4.2 提取登錄過(guò)程的共性信息
應(yīng)用系統(tǒng)在登陸的過(guò)程中首先要獲取它們的共性信息,然后通過(guò)不同的句柄來(lái)判斷是哪個(gè)應(yīng)用系統(tǒng).上文中我們講到了將Windows操作系統(tǒng)分成了“通用型”和“專(zhuān)用型”兩類(lèi)系統(tǒng),這對(duì)這兩類(lèi)不同的系統(tǒng)應(yīng)該有不同的處理方法.下面我們具體介紹一下這兩種不同的處理方法.
4.2.1 對(duì)于“通用型”Windows應(yīng)用系統(tǒng).方法如下:首先將應(yīng)用系統(tǒng)的頂層窗體利用EnumWindow()函數(shù)進(jìn)行枚舉.然后通過(guò)GetChWin()和GetNextWin()得到其樹(shù)狀的窗體結(jié)構(gòu);另外也可以通過(guò)調(diào)用EnumChildWin()函數(shù),枚舉出主窗體中的所有子窗體(控件)的句柄,從而獲得作為憑證的窗體的句柄.得到句柄后然后再對(duì)應(yīng)用系統(tǒng)中用戶(hù)輸入的信息進(jìn)行校驗(yàn),校驗(yàn)成功后即可登錄.
4.2.2 對(duì)于“專(zhuān)用型”Windows應(yīng)用系統(tǒng),不同于通用型應(yīng)用系統(tǒng)那么簡(jiǎn)單,首先要根據(jù)坐標(biāo)來(lái)定位每一個(gè)控件.
4.3 用戶(hù)登錄憑據(jù)模擬輸入的實(shí)現(xiàn)
SSO系統(tǒng)設(shè)計(jì)完成之后我們需要進(jìn)行一下模擬驗(yàn)證.用戶(hù)登錄憑據(jù)模擬輸入根據(jù)應(yīng)用系統(tǒng)類(lèi)別的不同,分為兩種方式.
4.3.1 利用SendMessage()函數(shù)直接向目標(biāo)窗體發(fā)送消息.通過(guò)上面的講述,我們知道“通用型”應(yīng)用系統(tǒng)中的窗體可以獲得窗體的句柄,從而可以得到相關(guān)的信息,如果我們要向目標(biāo)窗體發(fā)送相關(guān)消息的話就需要用到一個(gè)函數(shù):SendMessage()函數(shù).
對(duì)于可以獲得窗體句柄的窗體來(lái)說(shuō)可以通過(guò)這種方法來(lái)進(jìn)行發(fā)送消息,這種方法有他的優(yōu)點(diǎn):這種優(yōu)點(diǎn)就是我們可以通過(guò)對(duì)模擬輸入來(lái)實(shí)現(xiàn)目標(biāo)程序的自動(dòng)登錄,而且對(duì)前臺(tái)的一些操作也不會(huì)有什么影響.
而這種方法自然也有它的缺點(diǎn),其缺點(diǎn)就是我們不能對(duì)所有的窗體都通過(guò)這種模擬輸入的方法來(lái)進(jìn)行處理.有些特殊的窗體基于安全因素的考慮是不能夠使用SendMessage()函數(shù)的.當(dāng)然,值得注意的是,有些窗體中的輸入框根本就不是人們所認(rèn)為的窗體.因此,使用這種方法之后也會(huì)造成不必要的麻煩.
4.3.2 利用keybd_event()函數(shù).如果第一種方法不能支持的話我們就只能尋找其它的方法了.我們可以利用另一種函數(shù):Keydb_event函數(shù)進(jìn)行模擬輸入,其函數(shù)定義如下:
上述兩種函數(shù)是比較常用的函數(shù),如果這兩種函數(shù)都不能解決的話,MapVirtualKey()函數(shù)就可以將一些虛擬的代碼轉(zhuǎn)換成需要的掃描代碼,因此,如果上述兩種函數(shù)都不能解決的話可以通過(guò)第三種函數(shù)來(lái)解決,大部分的程序都可以通過(guò)這種方式來(lái)解決.
優(yōu)點(diǎn):該函數(shù)能夠適合大部分的程序,適用性強(qiáng).
缺點(diǎn):該函數(shù)的缺點(diǎn)就是,如果目標(biāo)程序是活動(dòng)的窗口的話就無(wú)法實(shí)現(xiàn)后臺(tái)模擬輸入.
本文涉及的SSO系統(tǒng)克服了傳統(tǒng)SSO系統(tǒng)的缺點(diǎn),而且實(shí)現(xiàn)了Windows應(yīng)用系統(tǒng)的單點(diǎn)自動(dòng)登錄,提高了企事業(yè)單位的工作效率,而且使企事業(yè)單位的應(yīng)用系統(tǒng)更加安全快捷.但是不足的地方就是:Windows應(yīng)用系統(tǒng)自動(dòng)登錄的時(shí)候不能夠?qū)崿F(xiàn)后臺(tái)登陸,比如QQ等;另外,對(duì)于一些JAVA開(kāi)發(fā)的程序也無(wú)法實(shí)現(xiàn)自動(dòng)登錄.
〔1〕康威,李凱.統(tǒng)一用戶(hù)認(rèn)證和單點(diǎn)登錄解決方案[EB/0L],計(jì)算機(jī)世界報(bào),2005,36.
〔2〕Kohl J,Neuman C.RFC 1510,The Kerberos NetworkAuthentication Service(v5),IETF,1993.
〔3〕M icrosoftCorporation M icrosoft.NET Passport Technical Overview,2001.
〔4〕雷愛(ài)平.基于網(wǎng)格支持單點(diǎn)登錄的企業(yè)級(jí)分布式權(quán)限管理框架(PM I)系統(tǒng)[D].浙江大學(xué)出版社,2005.
〔5〕MSDN W indows and M essages.http://msdn. m icrosoft.com/en-us/library/ms632586(v=VS. 85).aspx.
〔6〕中國(guó)惠普有限公司惠普靈動(dòng)單點(diǎn)登錄(SSO)解決方案[EB/OL],2005-8-29.
TP393
A
1673-260X(2014)03-0028-03