單點登錄的簡單實現

以下文字轉載自:http://dev2dev.bea.com.cn/techdoc/20060228739.html 

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

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

  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。比較麻煩。
  4. 另外,如果不想掏銀子,也有OPEN SOURCE的SSO軟件可選:主要有:http://www.josso.org/ https://opensso.dev.java.net/ http://www.sourceid.org 等。具體怎麼樣就不清楚了。

  如果項目對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的安全進行設置。

對IE中的JRE的安全進行設置

其他:

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

單點登錄SSO技術資料收集

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章