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