資源描述:
《基于net的單點登錄sso解決方案_畢業(yè)設(shè)計論文》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學術(shù)論文-天天文庫。
1、基于.Net的單點登錄(SSO)解決方案畢業(yè)設(shè)計論文?????前些天一位朋友要我?guī)兔ψ鲆粏吸c登錄,其實這個概念早已耳熟能詳,但實際應(yīng)用很少,難得最近輕閑,于是決定通過本文來詳細描述一個SSO解決方案,希望對大家有所幫助。SSO的解決方案很多,但搜索結(jié)果令人大失所望,大部分是相互轉(zhuǎn)載,并且描述的也是走馬觀花。?????閑話少敘,進入正題,我的想法是使用集中驗證方式,多個站點集中Passport驗證。?如下圖所示:?????為方便清晰描述,先定義幾個名詞,本文中出現(xiàn)之處均為如下含義。??????主站:Passport集中驗證服務(wù)器?http://www.passport.com/?
2、。??????分站:http://www.a.com/、http://www.b.com/、http://www.c.com/???????憑證:用戶登錄后產(chǎn)生的數(shù)據(jù)標識,用于識別授權(quán)用戶,可為多種方式,DEMO中主站我使用的是Cache,分站使用Session。??????令牌:由Passport頒發(fā)可在各分站中流通的唯一標識。?????OK,現(xiàn)在描述一下單點登錄的過程:?????情形一、匿名用戶:匿名用戶訪問分站a上的一個授權(quán)頁面,首先跳轉(zhuǎn)到主站讓用戶輸入帳號、密碼進行登錄,驗證通過后產(chǎn)生主站憑證,同時產(chǎn)生令牌,跳轉(zhuǎn)回分站a,此時分站a檢測到用戶已持有令牌,于是用令牌再次去
3、主站獲取用戶憑證,獲取成功后允許用戶訪問該授權(quán)頁面。同時產(chǎn)生分站a的本地憑證,當該用戶需要再次驗證時將先檢查本地憑證,以減少網(wǎng)絡(luò)交互。?????情形二、在分站a登錄的用戶訪問分站b:因為用戶在分站a登錄過,已持有令牌,所以分站b會用令牌去主站獲取用戶憑證,獲取成功后允許用戶訪問授權(quán)頁面。同時產(chǎn)生分站b的本地憑證。?????設(shè)計完成后,接下來是方案實現(xiàn)的一些關(guān)鍵點:?????令牌:令牌由主站頒發(fā),主站頒發(fā)令牌同時生成用戶憑證,并記錄令牌與用戶憑證之間的對應(yīng)關(guān)系,以根據(jù)用戶提供的令牌響應(yīng)對應(yīng)的憑證;令牌要在各跨域分站中進行流通,所以DEMO中令牌我使用主站的Cookie,并指定Co
4、okie.Domain="passport.com"。各分站如何共享主站的Cookie?從分站Redirect到主站頁面,然后該頁面讀取Cookie并以URL參數(shù)方式回傳即可,可在DEMO代碼中查看詳細實現(xiàn),當然如果哪位有更好的令牌實現(xiàn)方式也拿出來分享。//產(chǎn)生令牌string?tokenValue?=?Guid.NewGuid().ToString().ToUpper();HttpCookie?tokenCookie?=?new?HttpCookie("Token");tokenCookie.Values.Add("Value",?tokenValue);tokenCooki
5、e.Domain?=?"passport.com";Response.AppendCookie(tokenCookie);??????主站憑證:主站憑證是一個關(guān)系表,包含了三個字段:令牌、憑證數(shù)據(jù)、過期時間。有多種實現(xiàn)方式可供選擇,要求可靠的話用數(shù)據(jù)庫,要求性能的話用Cache,DEMO中我使用的是Cache中的DataTable。如下代碼所示:///?///?初始化數(shù)據(jù)結(jié)構(gòu)///?///?///?----------------------------------------------------///?
6、?token
7、(令牌)?
8、?info(用戶憑證)?
9、?timeout(過期時間)?
10、///?
11、--------------------------------------------------
12、///?private?static?void?cacheInit(){????if?(HttpContext.Current.Cache["CERT"]?==?null)????{????????DataTable?dt?=?new?DataTable();????????dt.Columns.Add("token",?Type.GetType("System.String")
13、);????????dt.Columns["token"].Unique?=?true;????????dt.Columns.Add("info",?Type.GetType("System.Object"));????????dt.Columns["info"].DefaultValue?=?null;????????dt.Columns.Add("timeout",?Type.GetType("System.DateTime"));????????dt.Columns["timeout"