大型的互聯(lián)網(wǎng)網(wǎng)站總有不少獨立的網(wǎng)絡(luò)應(yīng)用,而每個應(yīng)用都有些需要用戶登陸后才能看到的內(nèi)容。很明顯,你不想在每個應(yīng)用里搞一套自己的登陸方案,設(shè)置自己的登陸頁面。再說,如果用戶每換一個應(yīng)用就需要登陸一次,很麻煩,我們需要一個統(tǒng)一的登陸方案,用戶登陸一次即可訪問其他應(yīng)用的方案。
在論壇上看到過一些建議,一般都是利用ASP.NET里基于Form的認證方法,其中一個方案是把所有的應(yīng)用變成子目錄,而非單獨的虛擬目錄,然后集中起來放在一個虛擬目錄下,然后在虛擬目錄下設(shè)置單一的認證。但這方案大概只適用于網(wǎng)絡(luò)應(yīng)用都集中在單一服務(wù)器上的情形,而且強制去虛擬化也減少了其中應(yīng)用們的相對獨立性。
當然,微軟已經(jīng)提供了一個很好的方案,Passport認證服務(wù)。ASP.NET也支持這服務(wù),查看一下System.Web.Security命名空間下以Passport開頭的類名就知道了。如果你想在你的應(yīng)用里使用Passport認證服務(wù)的話,你需要下載.NET Passport SDK,可以參考
或DEVX網(wǎng)站上的這篇文章
Set Up Passport Authentication in ASP.NET
看是如何設(shè)置的。
但在很多情形下,這方案也許不是很恰當,但我們可以模仿Passport認證服務(wù)的工作機理來定做一個方案。在MSDN上好象找不到詳細的Passport協(xié)議內(nèi)容,找到的這一頁則不夠詳細。你可以參考下列文章來了解一下Passport認證過程:
Enable Single Sign-on in ASP.NET with Passport
但大概的過程是這樣的:
一。用戶訪問你網(wǎng)站上的某一網(wǎng)頁
二。兩種情形
A。如果你的網(wǎng)頁發(fā)現(xiàn)用戶尚未被認證,則顯示認證登陸(Sign In)按鈕
1。用戶按登陸按鈕
2。你的網(wǎng)頁重新定向用戶請求到認證服務(wù)器,并提供你的網(wǎng)站的ID
3。兩種情形
a。如果認證服務(wù)器通過cookie發(fā)現(xiàn)用戶尚未被認證,認證服務(wù)器顯示用戶名字/密碼登陸表單,用戶輸入名字/密碼,認證服務(wù)器認證后,在用戶瀏覽器端生成一個認證cookie,并重新定向用戶請求回到原來你的網(wǎng)頁,并在URL里提供用預(yù)先生成的你網(wǎng)站的公鑰加密過的ticket和用戶profile信息,這些信息的細節(jié)參考上述文章
b。如果認證服務(wù)器通過cookie發(fā)現(xiàn)用戶已經(jīng)被認證過(也許是在別的應(yīng)用/網(wǎng)站里),認證服務(wù)器更新那個認證cookie,并重新定向回到原來你的網(wǎng)頁,并在URL里提供用預(yù)先生成的你網(wǎng)站的公鑰加密的ticket和用戶profile信息
你的網(wǎng)頁檢查URL,用預(yù)先生成的你網(wǎng)站的私鑰,獲取用戶信息,生成一認證cookie,然后顯示退出認證(Sign Out)按鈕
B。如果你的網(wǎng)頁發(fā)現(xiàn)用戶已經(jīng)被認證,顯示退出認證(Sign Out)按鈕
三。如果用戶點擊退出認證按鈕,則將觸發(fā)一個到認證服務(wù)器的退出認證網(wǎng)頁的請求,認證服務(wù)器的退出網(wǎng)頁根據(jù)回來的認證cookie,為每個目前用戶已經(jīng)登陸的應(yīng)用/網(wǎng)站生成一個〈IMG〉,其屬性SRC則指向各個應(yīng)用/網(wǎng)站的退出認證頁面,并使認證服務(wù)器的認證cookie過期。而各個應(yīng)用/網(wǎng)站的退出認證網(wǎng)頁,則把自己的認證cookie過期。
結(jié)果是,用戶點擊退出認證按鈕的話,他將從目前登陸的所有應(yīng)用/網(wǎng)站退出。
當然,你定制的方案也許不用這么復(fù)雜或健壯,你可以考慮不使用PKI。
聯(lián)系客服