1. 程式人生 > >單點登陸的簡單實現

單點登陸的簡單實現

在門戶專案中,經常會遇到如何實現單點登入的問題,下面就本人的經驗做個總結。歡迎大家進行補充討論。

單點登入的具體實現有很多種選擇,包括:

  1. 採用專門的SSO商業軟體: 主要有:Netgrity的Siteminder,已經被CA收購。Novell 公司的iChain。RSA公司的ClearTrust等。
  2. 採用門戶產品供應商自己的SSO產品,如:BEA的WLES,IBM 的Tivoli Access Manager,Sun 公司的identity Server,Oracle公司的OID等。
  3. 這些商業軟體一般適用於客戶對SSO的需求很高,並且企業內部採用COTS軟體如:Domino,SAP,Sieble的系統比較多的情況下采用。並結合身份管理。統一認證等專案採用。採用這些軟體一般都要對要整合的系統做些改造,如在要整合的系統上安裝AGENT。現在一般只提供常見軟體如:Domino,SAP,Sieble,常見應用伺服器:weblogic,websphere等的AGENT。要先統一這些系統的認證。一般採用LDAP或資料庫。然後才能實現SSO。比較麻煩。

  如果專案對SSO的要求比較低,又不想對要被整合的系統做任何改動,可採用下面介紹的方式簡單實現:下面我們通過一個例子來說明。假如一個門戶專案要對下面的幾個系統做SSO。


 使用者在這些系統中的使用者名稱,密碼各不相同,如:員工號為001的員工在這些系統中的使用者名稱,密碼分別如下:

使用者 系統 使用者名稱 密碼
001 Portal系統 A 1234
001 郵件系統 B 2345
001 DOMINO系統 C AAAA
001 報銷系統 D CCCC
001 工資系統 E BBBB

首先,建立員工在PORTAL系統中的使用者名稱和其他系統中的使用者名稱之間的對應關係

  首先,要建立員工在PORTAL系統中的使用者名稱和其他系統中的使用者名稱之間的對應關係並儲存。可儲存在表中或LDAP中或檔案系統中。當然要考慮這些系統之間的資料同步問題。比較好的方式是找到使用者在這些系統中的都存在的唯一資訊(如員工號,MAIL地址,姓名等)。通過唯一資訊實時到各個系統中去取認證所需要的資訊。就不需要考慮資料同步問題。比較實用。可以建立類似下面的表:密碼可採用加密儲存。如果是採用BEA的Weblogic Portal,可採用UUP來儲存這些資訊。

	(
	
	user	 varchar2(20),   	/*使用者名稱*/
	app_name varchar2(20),  	/*應用系統*/
	architect varchar2(4),  		/*應用系統的架構BS或CS*/
	app_company varchar2(50),          /*使用者所屬分公司*/
	app_department varchar2(50),      /*使用者所在的部門*/
	app_user varchar2(15),                 /*在該系統中的使用者名稱*/
	app_passwd varchar2(15), 	/*在該系統中的密碼*/
	app_cookie varchar2(30),              /*COOKIE名稱*/
	form_user varchar2(20),                /*認證頁面中FORM的使用者名稱欄位*/
	form_passwd varchar2(20),          /*認證頁面中FORM的密碼欄位*/
	app_special  varchar2(20)           /*其他*/
	);

通過IFRAME或超連線方式整合目標系統,並進行SSO

  通過IFRAME或超連線方式整合目標系統,並在URL中帶上使用者名稱和密碼。如整合DOMINO可採用如下方式:

  <IFRAME src=http://host1/names.nsf?Login&Username=admin&Password=pass&RedirectTo=/names.nsf
width="100%" frameborder="0" align="middle" height="100%" hspace="0" marginheight="0" marginwidth="0" scrolling="yes" style="background-color:#f7f7ff;">
</IFRAME>

  或: 
Href src=“http:// host1/names.nsf?Login&Username=admin&Password=pass&RedirectTo=/names.nsf” 
以上採用的是在HTTP中直接傳遞明碼,為提高安全性,可採用HTTPS來傳遞使用者名稱和密碼。另外採用這種方式被整合的系統必須支援FORM方式認證。J2EE應用,DOMINO等都支援FORM認證。

  這兩種方式如果SSO成功,就自動進入目標系統的介面,如果實現會顯示目標系統的登入介面。其效果圖如下:


這種方式,必須維護對應關係表,如上面的sso_info。更好的方式是提供介面,讓終端使用者自己維護這種對應關係,可模仿Compoze portlets for lotus的做法,在使用者第一次進入要與之做SSO的系統時,如DOMINO系統,顯示一個介面,讓使用者自己輸入他在該系統中的使用者名稱/密碼等資訊。並儲存到表中或LDAP等其他資料來源中。以後使用者要進入這些系統時,就直接從表中或其他資料來源中取使用者的使用者名稱/密碼等資訊,幫助使用者做認證。建議採用這種方式。如下圖所示。如果使用者改變了自己在DOMINO系統中的使用者名稱,密碼。從門戶系統進入DOMINO系統時,認證會失敗,就重新顯示類似下面的介面。讓使用者重新輸入他在DOMINO系統中新的使用者名稱,密碼並儲存。


以上這種實現方式,一般需要瀏覽器支援COOKIE,所以要注意瀏覽器的配置,在開發階段,為方便除錯,可設定IE,讓它顯示COOKIE的名稱。如下所示:


採用這種方式,對要整合的系統不需要做任何的改動。如果PORTAL系統中的使用者在被整合的系統中的許可權都一樣,可採用建立一個通用使用者的做法。也就是所有在PORTAL系統中的使用者都採用這個通用使用者進入目標系統。這種方式等於是採用頁面整合方式做整合。比較方便使用。另外,有時候需要採用呼叫API,或配置Adapter等應用整合方式來整合其他系統,一般也是通過定義一個連線專用的使用者。在API中或在配置Adapter的時候寫死。如採用JAVA API方式整合DOMINO:

  lotus.domino.Session dominoSession = NotesFactory.createSession(dominoServer, “admin”, “password”);

CS結構實現方式

  經常有人問CS結構的應用如何實現SSO,本人的建議是對這種系統不要自己去實現SSO。很麻煩,其實輸個使用者名稱,密碼沒什麼大不了的。如果要實現,一是採用商業軟體。另外也可以採用以下方式:在PORTAL的PORTLET上建立超連線。並通過APPLET方式啟動CS結構的應用系統的登入介面。然後通過如下的方式把使用者名稱/密碼傳遞過去。

  -不能做任何改動的客戶端 - WIN訊息(給登入視窗傳送使用者名稱,密碼等登入所需要的資訊),模擬鍵盤(java有模擬鍵盤輸入的API)

  -可以做改動的客戶端 - 引數傳遞,並讓登入的EXE檔案讀取引數進行認證。

  因為要讓APPLET執行本地的EXE檔案,所以必須對IE中的JRE的安全進行設定。


其他:

  在採用以上方式實現了SSO後,要注意LOGOUT,可採用與LOGIN相同的方式。也可以通過被整合系統的超時設定來實現。

單點登入SSO技術資料收集