單一登陸(Single Sign-on)問題

大型的互聯網網站總有不少獨立的網絡應用,而每個應用都有些需要用戶登陸後才能看到的內容。很明顯,你不想在每個應用裏搞一套自己的登陸方案,設置自己的登陸頁面。再說,如果用戶每換一個應用就需要登陸一次,很麻煩,我們需要一個統一的登陸方案,用戶登陸一次即可訪問其他應用的方案。

在論壇上看到過一些建議,一般都是利用ASP.NET裏基於Form的認證方法,其中一個方案是把所有的應用變成子目錄,而非單獨的虛擬目錄,然後集中起來放在一個虛擬目錄下,然後在虛擬目錄下設置單一的認證。但這方案大概只適用於網絡應用都集中在單一服務器上的情形,而且強制去虛擬化也減少了其中應用們的相對獨立性。

當然,微軟已經提供了一個很好的方案,Passport認證服務。ASP.NET也支持這服務,查看一下System.Web.Security命名空間下以Passport開頭的類名就知道了。如果你想在你的應用裏使用Passport認證服務的話,你需要下載.NET Passport SDK,可以參考

.NET Passport Single Sign-In

或DEVX網站上的這篇文章

Set Up Passport Authentication in ASP.NET

看是如何設置的。

但在很多情形下,這方案也許不是很恰當,但我們可以模仿Passport認證服務的工作機理來定做一個方案。在MSDN上好象找不到詳細的Passport協議內容,找到的這一頁則不夠詳細。你可以參考下列文章來了解一下Passport認證過程:

Enable Single Sign-on in ASP.NET with Passport

但大概的過程是這樣的:

一。用戶訪問你網站上的某一網頁
二。兩種情形
     A。如果你的網頁發現用戶尚未被認證,則顯示認證登陸(Sign In)按鈕
       1。用戶按登陸按鈕
       2。你的網頁重新定向用戶請求到認證服務器,並提供你的網站的ID
       3。兩種情形
           a。如果認證服務器通過cookie發現用戶尚未被認證,認證服務器顯示用戶名字/密碼登陸表單,用戶輸入名字/密碼,認證服務器認證後,在用戶瀏覽器端生成一個認證cookie,並重新定向用戶請求回到原來你的網頁,並在URL裏提供用預先生成的你網站的公鑰加密過的ticket和用戶profile信息,這些信息的細節參考上述文章
           b。如果認證服務器通過cookie發現用戶已經被認證過(也許是在別的應用/網站裏),認證服務器更新那個認證cookie,並重新定向回到原來你的網頁,並在URL裏提供用預先生成的你網站的公鑰加密的ticket和用戶profile信息

         你的網頁檢查URL,用預先生成的你網站的私鑰,獲取用戶信息,生成一認證cookie,然後顯示退出認證(Sign Out)按鈕

     B。如果你的網頁發現用戶已經被認證,顯示退出認證(Sign Out)按鈕

三。如果用戶點擊退出認證按鈕,則將觸發一個到認證服務器的退出認證網頁的請求,認證服務器的退出網頁根據回來的認證cookie,爲每個目前用戶已經登陸的應用/網站生成一個〈IMG〉,其屬性SRC則指向各個應用/網站的退出認證頁面,並使認證服務器的認證cookie過期。而各個應用/網站的退出認證網頁,則把自己的認證cookie過期。

結果是,用戶點擊退出認證按鈕的話,他將從目前登陸的所有應用/網站退出。

當然,你定製的方案也許不用這麼複雜或健壯,你可以考慮不使用PKI。

轉自:http://blog.joycode.com/saucer/archive/2004/02/25/13789.aspx

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