OpenID 背景知識介紹
傳統的身份認證是將用戶信息存放在一個獨立 的系統中,可能是目錄服務器,數據庫,本地文件系統或自定義的系統。認證時 ,用戶提供用戶名和密碼,與用戶信息系統進行核對,確認用戶是否合法。而 OpenID 是一個去中心化的網上身份認證系統。對於支持 OpenID 的網站,用戶 不需要記住像用戶名和密碼這樣的傳統驗證標記。取而代之的是,他們只需要預 先在一個作為 OpenID 身份提供者(Identity Provider)的網站上注冊,通過 在身份提供者網站的認證而完成支持 OpenID 的網站的認證,從而大大簡化了身 份驗證過程。
任何網站都可以使用 OpenID 來作為用戶登錄的一種方式 ,任何網站也都可以作為 OpenID 身份提供者。因為 OpenID 既解決了問題而又 不需要依賴於中心性的網站來確認數字身份,所以正在被越來越多的大網站采用 ,例如 Google, Facebook,myOpenID 和 Yahoo,他們都是 OpenID 身份提供 者。目前主流的 OpenID 規范有兩種,一種是 OpenID 2.0,一種是 OAuth 1.0 。Google,myOpenID 和 Yahoo 采用的是 OpenID 2.0 規范,Facebook 采用的 是 OAuth 1.0 規范。
OpenID 規范只定義了基本的認證機制,在應用當 中,往往還需要與 OpenID 身份提供者之間進行用戶屬性的交換,因此在 OpenID 規范基礎之上,還有兩個關於屬性交換的協議,SREG(Simple Registration)和 AX(Attribute Exchange)。SREG 只定義了一些常用的屬性 ,例如 nickname,email 和 fullname。AX 更加復雜一些,它實際上可以交換 任何信息,只要交換的雙方都定義了該屬性。
WebSphere Portal 8.0 對 OpenID 的支持
WebSphere Portal 作為一個信息提供者,從 8.0 版本開始支持 OpenID , 用戶可以通過配置指定自己支持哪些 OpenID 身份提供者,在登錄界面選擇適當 的身份提供者進行認證,從而達到認證 WebSphere Portal 的目的,進一步訪問 網站內的個性化信息和服務。從實現角度講,WebSphere Portal 是基於 WebSphere 應用服務器的,WebSphere 應用服務器本身提供一種插入點——信任 關聯攔截器(Trust Association Interceptor,TAI),可以通過實現 TAI 來 完成認證的交接,WebSphere Portal 8.0 正是實現了 TAI,從而在 WebSphere 應用服務器和 OpenID 身份認證者之間建立信任關系。另外,即使配置了 OpenID 身份提供者,WebSphere Portal 用戶仍然可以按照原有的方式進行登錄 。
WebSphere Portal 中配置 OpenID 有兩種方式,用戶可以根據自己的 需要選擇一種方式將外部用戶整合到 WebSphere Portal 中,當然二者也可以混 合使用:
WebSphere Portal 中的一個用戶與 OpenID 身份提供者的一個用戶綁定,二 者一一對應。這種映射關系會存儲到用戶的屬性中,具體存儲在哪個屬性裡可以 在 WebSphere Portal 中進行定制。
將 OpenID 身份提供者的用戶整體作為一個 WebSphere Portal 用戶。管理 員可以統一為這些用戶設置權限,而不需要他們在 WebSphere Portal 中重新注 冊用戶。這種配置方式對用戶使用來說需要的步驟較少,而管理員需要做更多的 配置步驟。
這兩種不同的配置方式中屬性交換的配置位置是不同的。本文會以 OpenID 2.0 規范為例,具體介紹 WebSphere Portal 中配置 OpenID 的這兩種方式和一 些使用示例。
OpenID 身份提供者用戶與 WebSphere Portal 用戶一一映 射的配置
這種配置方式中,OpenID 身份提供者的一個用戶可以與 WebSphere Porta 的用戶綁定,一一映射,例如 OpenID 身份者的一個用戶名為 portal80user1, 與 WebSphere Portal 的用戶 user1 綁定。當然,這不意味著 OpenID 身份提 供者的每個用戶都與 WebSphere Portal 的用戶映射,也不要求 WebSphere Portal 中的每個用戶都與 OpenID 身份提供者的用戶映射,這種映射關系可以 由用戶自身指定,因此它存儲在用戶的某個屬性裡,具體存儲在哪個屬性是可以 定制的。
配置步驟
WebSphere Portal 可以同時配置多個 OpenID 身份提供者,例如 Google, Yahoo 和 myOpenID,管理員可以決定選擇與哪些 OpenID 身份提供者配置。但 在配置之前,必須保證 WebSphere Portal 服務器的系統時間是正確的。假定 WebSphere Portal 服務器是安裝在 Linux 操作系統上,管理員希望配置 Google 和 Yahoo 兩個 OpenID 身份提供者,具體配置過程如下。
1. 運 行 enable-identityprovider-tai 任務
首先管理員需要運行 enable- identityprovider-tai任務:
./ConfigEngine.sh enable- identityprovider-tai -Didp.providerlist=openid \
-Dopenid.servicenames=Google,Yahoo - Dopenid.servicenames.endpoints=\
https://www.google.com/accounts/o8/id,http://me.yahoo.com \
-DWasUserId=wpsadmin -DWasPassword=wpsadmin
該任務中使用的定制參數含義如下:
-Didp.providerlist
指定支持的 OpenID 身份提供者類型列表。如果是配置 Google 和 Yahoo 等 滿足 OpenID 2.0 規范的身份提供者,那麼該參數值是 openid ,如果是配置 FaceBook 等滿足 OAuth 1.0 的身份提供者,那麼該參數值是 facebook。在我 們的假定情況下,這個參數應該是 openid。
-Dopenid.servicenames
如果配置 OpenID 2.0 的身份提供者,該參數應列出需要配置的身份提供者 列表。在我們的假定情況下,這個參數應該是 Google,Yahoo。
-Dopenid.servicenames.endpoints
OpenID 身份認證者的端點 URL,如果配置了多個身份認證者,這裡應該一一 列出,所以這個參數列表中參數的個數應該和 -Dopenid.servicenames一致。在 我們假定的情況下,這個參數應該是 https://www.google.com/accounts/o8/id,https://me.yahoo.com/。
值得注意的是,這個任務是可以反復運行的,第二次運行的結果會覆蓋前一 次,也就是說,如果用戶想增加一個支持的 OpenID 身份提供者,在重新運行這 個任務時,必須在參數中把原有的身份提供者和新增的身份提供者都列出。
2. 修改 Profile Management 和 Login 兩個 portlet 的配置參數
為了在界面中顯示那些為支持 OpenID 設計增加的元素,需要對 Profile Management 和 Login 兩個 Portlet 進行額外的配置。這些配置必須 以管理員的身份去做。
首先作為管理員登錄 WebSphere Portal,浏覽到 Administration>Portlet Management>Portlets,找到 Login Portlet, 點擊 Configure portlet 按鈕,修改以下參數並保存:
show_idp_option
是否顯示 Login portlet 中為支持 OpenID 而設計的元素,缺省是 false, 在我們的假定情況中應該設置成 true。
show_idp_max
顯示的 OpenID 身份提供者的最大數目。缺省是 4,在我們的假定情況下可 以設置成 2。
providername.image
身份提供者的圖標。Login portlet 缺省沒有這個參數,需要管理員添加。 如果配置多個身份提供者,會有多個這樣的參數。在我們的假定情況中,需要添 加下面的兩個參數。如果沒有指定,圖標上的內容(文字)會是身份提供者的名 字。
Google.image: https://www.google.com/intl/en_ALL/images/logos/images_logo_lg.gif
Yahoo.image: http://l.yimg.com/a/i/ww/met/yahoo_logo_us_061509.png
然後找到 Profile Management portlet,點擊 Configure portlet 按鈕 ,修改以下參數並保存:
show_idp_option
是否顯示 Login portlet 中為支持 OpenID 而設計的元素,缺省是 false, 在我們的假定情況中應該設置成 true。
show_idp_max
顯示的 OpenID 身份提供者的最大數目。缺省是 4,在我們的假定情況下可 以設置成 2。
providername.image
身份提供者的圖標。Login portlet 缺省沒有這個參數,需要管理員添加。 如果配置多個身份提供者,會有多個這樣的參數。在我們的假定情況中,需要添 加兩個參數,如下所示。如果沒有指定,圖標上的內容(文字)會是身份提供者 的名字。
Google.image: https://www.google.com/intl/en_ALL/images/logos/images_logo_lg.gif
Yahoo.image: http://l.yimg.com/a/i/ww/met/yahoo_logo_us_061509.png
3. 拷貝必要的文件
將以下文件拷貝至 AppServer_root\lib\ext 目錄下:
PortalServer_root\prereqs.infra\prereq.commons.httpclient\lib \ext\commons-codec-1.3.jar PortalServer_root\prereqs.infra\prereq.commons.httpclient\lib\ext\comm ons-httpclient-3.0.1.jar
4. 獲取 OpenID 身份提供者的 SSL 證書
作為管理員登錄到 WebSphere 集成解決方案控制台(Integrated Solutions Console),浏覽至 Security>SSL certificate and key management,在 Configuration settings 下點擊 Manage endpoint security configurations,在 Outbound>hostname>nodes>node_name>servers 中,選擇 WebSphere_Portal,然後在 Related Items 中選擇 Key stores and certificates。
單擊 NodeDefaultTrustStore,在 Additional Properties 中選擇 Signer certificates。
然後為每個 OpenID 身份提 供者單擊 Retrieve from port,填入以下信息:
Host
OpenID 身份提供者的端點,不包含協議頭。在我們假定的情況中,為 Google 應該輸入 www.google.com,為 Yahoo 應該輸入 me.yahoo.com。
Port
OpenID 身份提供者的端口號,通常是 443。
Alias
為 SSL 證書指定別名,名字可以是任意的,但最好能標識身份提供者。例如 為 Google 可以輸入 Google,為 Yahoo 可以輸入 Yahoo_cert 等。
點擊 Retrieve signer information,獲取身份提供者的 SSL 證書,然後保 存。在我們假設的情況下,這裡會分別為 Google 和 Yahoo 獲取證書並保存。
5. 重啟 WebSphere Portal 服務器
在 wp_profile_root/bin目 錄下運行以下命令,重啟 WebSphere Portal 服務器,使得以上配置生效。
./stopServer.sh WebSphere_Portal -username admin_userid - password admin_password ./startServer.sh WebSphere_Portal
配置完成後,WebSphere Portal 的登錄頁面會如圖一所示。
圖 1. 配置 OpenID 後 WebSphere Portal 的登錄頁面
屬性交換
WebSphere Portal 為用戶定義了 Schema,也就是它所支持的全部用戶屬性 集合,OpenID 身份提供者也會為存儲的用戶定義它的用戶 Schema,二者之間可 以進行更具體的信息交換,也就是屬性交換。在一一映射這種方式下,屬性交換 是在 Profile Management portlet 的配置中完成的。
作為管理員登錄 WebSphere Portal,浏覽到 Administration>Portlet Management>Portlets,找到 Profile Management portlet,點擊 Configure portlet 按鈕,添加或修改以下參數:
providername.protocol
屬性交換采用的協議,可以是 openid.sreg(SREG)或 openid.ax(AX), 這要取決於 OpenID 身份提供者支持哪種協議。管理員要為每個 OpenID 協議提 供者要定義屬性交換所采用的協議,通常使用 AX。在我們假定的情況下,需要 定義 Google.protocol 和 Yahoo.protocol 兩個參數,值都是 openid.ax。
providername.required
屬性交換時必要的屬性映射列表,每組屬性映射之間用“;”隔開,屬性映 射內 WebSphere Portal 的用戶 Schema 屬性和 OpenID 身份提供者的屬性之間 用”|”隔開。在我們假定的情況裡,可以定義 Google.required 如下:
Google.required: ibm-primaryEmail| http://axschema.org/contact/email;preferredLanguage| http://axschema.org/pref/language;givenName| http://axschema.org/namePerson/first;sn|http://axschema.org/namePerson /last
providername.optional
屬性交換時可選的屬性映射列表,類似 providername.required,只是不要 求映射的屬性在 OpenID 身份提供者必須存在。
設定或修改屬性交換的配置後,需要重啟 WebSphere Portal 服務器,以便 生效。
映射關系存儲位置的修改
缺省情況下,WebSphere Portal 用戶和 OpenID 身份提供者用戶之間的映射 關系是存在用戶 Schema 的 labeledURI 屬性裡,可以通過定制 Profile management portlet 來將該屬性值顯示出來。當然也可以將這個映射關系存儲 在其他屬性值裡,如果管理員希望,甚至可以為用戶 Schema 添加新的屬性,並 將映射關系存放進去。
映射關系存儲位置的修改步驟如下:
用管 理員用戶登錄到 WebSphere 集成解決方案控制台,浏覽至 Security>Global Security>Web and SIP security>Trust association,選擇 interceptors,之後選擇 com.ibm.portal.auth.OpenIDTAI,添加(或修改) bindattribute 屬性,值是存放映射關系的用戶 Schema 中的屬性名(缺省是 labeledURI)。
使用示例
上面的配置步驟完成後,每個用戶都可以設置自己期望映射的身份提供者用 戶。假設 WebSphere Portal 用戶 user1 期望與 Google 的 portal80user1 映 射。
首先,以用戶 user1 登錄 WebSphere Portal 服務器,在 Profile Management portlet 裡,點擊 Associate different account,然後選擇 Google,頁面會自動跳轉到 Google 的登錄頁面,輸入 Google 帳號和密碼,如 圖二所示。
圖 2. 在 Google 的登錄頁面輸入帳號密碼
點擊登錄後會進入 Google 的確認頁面,再次點擊“登錄”,如圖三所示。
圖 3. 在 Google 的確認頁面點擊登錄按鈕
返回至 Profile Management portlet,點擊 OK 按鈕,保存映射關系,如圖 四所示。
圖 4. 保存映射關系後的 Profile Management portlet
我們前面提到,這種映射關系存放在“labeledURI”屬性裡,如圖五所示。 如果想看到它的值,需要管理員在配置 Profile Management portlet 時顯示“ labeledURI”屬性。
圖 5. 在 Profile Management portlet 中顯示 labeledURI 的值
我們還可以進一步配置屬性交換,如圖六所示。
圖 6. 配置 Profile Management portlet 完成屬性交換
重啟 WebSphere Portal 服務器之後,登錄 user1,在 Profile Management portlet 裡點擊 Update Profile Information 按鈕,在彈出的 Google 對話框 中選擇允許,如圖七所示。
圖 7. 在彈出的 Google 對話框中選擇允許
就會獲取到 Google 用戶 portal80user1 的 email,language,last name 和 given name 等四個屬性,如圖八所示。
圖 8. 獲取屬性交換信息後的 Profile Management portlet
至此,我們就可以嘗試用 Google 賬戶 portal80user1 登錄 WebSphere Portal,即在登錄頁面點擊 Google 圖標,轉入 Google 的登錄頁面,輸入帳號 portal80user1 和密碼,點擊登錄,用戶會被重定向回 WebSphere Portal 的 Welcome 頁面,如圖九所示。
圖 9. portal80user1 登錄 WebSphere Portal
因為我們配置了屬性交換,所以可以注意到,頁面的語言是 Google 用戶 portal80user1 設置的屬性“中文”,顯示的名字也是 portal80user1。
值得注意的是,user1 在 WebSphere Portal 端對用戶信息做任何更新 都不能寫回到 Google,但是依然可以使用 Update Profile Information 按鈕 來從 Google 更新個人信息到 WebSphere Portal。可以認為 WebSphere Portal 只是從身份提供者那裡讀取用戶信息,而不做任何修改操作。
OpenID 身 份提供者用戶整體作為一個 WebSphere Portal 用戶的配置
這種配置方 式下,OpenID 身份提供者的所有用戶統一作為一個 WebSphere Portal 用戶, 實際上他們是作為一個用戶組進行處理的。優勢是將全部外部用戶引入到 WebSphere Portal 當中,用戶需要做的操作也很少。WebSphere Portal 管理員 可以對每個 OpenID 身份提供者的所有用戶進行權限設置,從而控制他們對 WebSphere Portal 信息的訪問,WebSphere Portal 稱這些用戶為瞬態用戶 (transient user)。
配置步驟
這種配置方式下,WebSphere Portal 也可以同時配置多個 OpenID 身份提供者,管理員可以決定選擇哪些 OpenID 身份提供者進行配置。配置之前也必須保證 WebSphere Portal 服務器 的系統時間是正確的。我們依然假定 WebSphere Portal 服務器是安裝在 Linux 操作系統上,管理員希望配置 Google 和 Yahoo 這兩個 OpenID 身份提供者, 具體配置過程如下。
1. 運行 enable-identityprovider-tai 任務
這一步與前一種配置方式完全一致,不再贅述。
2. 運行 enable-transient-user 任務
以管理員身份需要運行 enable- transient-user任務,如下:
./ConfigEngine.sh enable-transient- user -DWasUserId=wpsadmin -DWasPassword=wpsadmin -Dtransparent.suffix=o=transparent -Dtransparent.prefix=uid
該任務中使用的定制參數含義如下:
- Dtransparent.suffix
瞬態用戶的後綴。OpenID 身份提 供者的所有用戶其實是作為 WebSphere Portal 一個用戶組進行處理的,- Dtransparent.suffix 就是組的後綴。該參數的缺省值是 o=transparent,它的 值不能與已有的用戶存儲體(User Registry)沖突,也就是說如果當前系統中 存在 o=transparent 的用戶存儲體,那麼在運行 enable-transient-user任務 時就會遇到創建存儲體失敗的錯誤。 -Dtransparent.prefix
瞬態用戶的前綴 。缺省值是 cn,這裡使用了 uid。
3. 更新用戶存儲體設置
用管 理員身份登錄 WebSphere 集成解決方案控制台,浏覽至 Security>Globla Security,選擇 User account repository>Available realm definitions ,選擇 Federated Repositories,點擊 Configure 按鈕。在 Repositories in the realm 裡選擇 transientidp,transientidp 就是瞬態用戶所在的存儲體。 點擊 New 按鈕,添加以下屬性和值:
Buildgroupsfor: Google, Yahoo
4. 標記瞬態用戶為 WebSphere Portal 的外部用戶
這一步 驟是可選的。運行 enable-transient-user任務後,系統就會為每個 OpenID 身 份提供者創建一個內部組,你可以在 Resource Permissions Portlet 裡為這些 組賦權限,例如創建一些頁面供瞬態用戶查看和使用。還可以將瞬態用戶與 WebSphere Portal 的外部用戶這一特性結合起來。可以為一組外部用戶或瞬態 用戶指定一個數據庫後綴,這樣所有的外部用戶和瞬態用戶都會在訪問權限控制 裡賦予一個特殊的虛擬身份(virtual principle)。管理員可以為這些虛擬身 份賦予一組更通用的權限。
作為管理員登錄 WebSphere 集成解決方案控 制台,浏覽至 Resources>Resource Environment>Resource Environment providers,選擇 PumaStoreService,定制屬性,添加下面的屬性和值:
parentDN.externalUsers: o=transparent
5. 重啟 WebSphere Portal 服務器
在 wp_profile_root/bin目錄下運行 以下命令,重啟 WebSphere Portal 服務器,使得以上配置生效。
./stopServer.sh WebSphere_Portal -username admin_userid -password admin_password ./startServer.sh WebSphere_Portal
屬性交換
這種配置方式下的屬性交換和一一映射的配置方式概念類似, 只是配置位置不同。
以管理員身份登錄 WebSphere 集成解決方案控制台 ,浏覽至 Security>Global Security>Web and SIP Security>Trust association>Interceptors,選擇 com.ibm.portal.auth.tai.OpenidTAI.。 添加以下屬性和值:
provider.openid.loadattributes=provider|method;provider2|method< /p>
其中 method 可以是 openid.sreg 或 openid.ax,取決 於 OpenID 身份提供者支持哪種屬性交換協議。 provider.openid.loadattributes.provider=portalattributename|idpa ttributename;portalattributename2|idpattributename2
具體的映射關系,類似前一種方式。每對映射關系用“|”隔開,映射關 系之間用“;”隔開,且必須在同一行。
所以在我們假定的情況下,需 要添加以下兩個屬性和值:
provider.openid.loadattributes: Google|openid.ax;Yahoo|openid.ax provider.openid.loadattributes.Google: uid|http://axschema.org/namePerson/first;cn| http://axschema.org/namePerson/last;ibm- primaryEmail|http://axschema.org/contact/email
設定或修改屬性交換的配置後,需要重啟 WebSphere Portal 服務器,以便生效 。
使用示例
以上配置步驟完成後,每個 Google 用戶都可以作為瞬態用戶登錄 wprhelblade12 這台 WebSphere Portal 服務器,即使他們沒有與 WebSphere Portal 中的用戶建立映射關系。
在登錄界面點擊 Google 圖標,以 portal80user2 用戶登錄 Google,重定向到 WebSphere Portal 後,會看到圖 十的內容。
圖 10. 瞬態用戶 portal80user2 登錄 WebSphere Portal 看到的頁面
點擊用戶 user2 會在 Profile Management portlet 裡看到從 Google 讀取 到的用戶信息,如圖十一所示。
圖 11. 瞬態用戶在 Profile Management portlet 中顯示的信息
以管理員身份登錄 WebSphere Portal 服務器,浏覽至 Administration>Access>User and Groups,選擇 All Portal User Groups,會看到每個 OpenID 身份提供者都有一個對應的組存在,如圖十二所示 。
圖 12. WebSphere Portal 中新增加的用戶組
可以在 Resource Permission portlet 中為這些組賦權限,對應 OpenID 身 份提供者的瞬態用戶就可以完成相應權限的操作。例如,在 Home 下創建一個子 頁面 Google Pages,並為 cn=Google,o=transparent 組賦予該頁面的編輯者 (Editor)權限,如圖十三所示。
圖 13. 在 Resource Permission portlet 中為瞬態用戶賦權限
那麼 portal80user2 這個瞬態用戶就可以編輯 Google Pages 頁面,添加 / 刪除 Portlet,如圖十四所示。
圖 14. 具有頁面編輯權限的瞬態用戶在頁面中添加 / 刪除 portlet
禁用瞬態用戶和 OpenID
以管理員身份登錄 WebSphere 集成解決方案控制台,浏覽至 Security>Global Security>Web and SIP Security>Trust association>Interceptors,選擇 com.ibm.portal.auth.tai.OpenidTAI, 將 create_user_during_logon 屬性設置為 false,就會禁用瞬態用戶。進一步 的,如果刪除 com.ibm.portal.auth.tai.OpenidTAI,就會禁用 OpenID 特性。
結束語
OpenID 是一個去中心化的網上身份認證系統,正在被越 來越多的大網站采用。作為 IBM 的社會化軟件之一,WebSphere Portal 正在逐 漸豐富其社會化方面的功能,將 OpenID 融入 WebSphere Portal 正是依據這樣 的發展方向而來,相信在不久的將來,WebSphere Portal 對 OpenID 的支持會 更加深入,從而在門戶網站產品中繼續保持領先優勢。