生活随笔
收集整理的這篇文章主要介紹了
单点登录在项目中的实现 转.
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近在做一個登錄功能,糾結(jié)了好幾天,一直在找一個能優(yōu)雅的實現(xiàn)單點(diǎn)登錄的功能。博客園有看到某人寫了又臭又長的八股文式的文章,沒看到有價值的東西。
其實單點(diǎn)登錄最終要解決的是多個不同域名間共享cookie的問題。但是要在不同域名間共享cookie是一件很困難的事情,要在某個域名下面種cookie就必須訪問該
域名。網(wǎng)上有很多方法,看到的有動態(tài)創(chuàng)建iframe實現(xiàn),在iframe里面訪問某個域名的頁面種下cookie,該方法需要寫一些js代碼,寫起來有點(diǎn)累,所以我最終
選擇了用頁面跳轉(zhuǎn)來實現(xiàn),想不到效果比我預(yù)期的好很多,瀏覽器幾乎看不出來有跳轉(zhuǎn)的痕跡。
詳細(xì)介紹下流程:
1. 項目有3個不同的域名,login.susucms.com, suhow.com, sigcms.com。其中l(wèi)ogin.susucms.com/login.aspx是登錄頁面。實現(xiàn)的功能是通過login.susucms.com/login.aspx登錄后能夠?qū)崿F(xiàn)在訪問其他域名也可以保持登錄狀態(tài)。
2. 在suhow.com和sigcms.com下分別添加一個sso.aspx的頁面。
3. 當(dāng)用戶在login.susucms.com/login.aspx頁面點(diǎn)擊登錄,服務(wù)器端通過驗證后生成一個token,接著服務(wù)器端Response.Redirect到suhow.com/sso.aspx,suhow.com/sso.aspx立即驗證這個token是否合法,如果合法則Reponse一個包含登錄信息的cookie,然后Response.Redirect到sigcms.com/sso.aspx,sigcms.com/sso.aspx也驗證這個token是否合法,如果合法則Reponse一個包含登錄信息的cookie,然后銷毀token,Response.Redirect到登錄后的后臺。
整個流程最核心的其實就是跳轉(zhuǎn)。沒有其他的了。經(jīng)過測試,服務(wù)器端響應(yīng)非常快,幾乎感覺不到任何跳轉(zhuǎn),所以再多跳轉(zhuǎn)幾個域名,我想是沒有什么大問題的。
簡單代碼:
1.?login.susucms.com/login.aspx
view sourceprint?
| 03 | ????var login = new CrossDomainLogin |
| 05 | ????????Key = Guid.NewGuid().ToString(), |
| 06 | ????????CreateTime = DateTime.Now |
| 08 | ????DataContext.CrossDomainLogins.InsertOnSubmit(login); |
| 09 | ????DataContext.SubmitChanges(); |
| 11 | ????WriteAuthenticationCookie(); |
| 12 | ????Response.Redirect("http://suhow.com/sso.aspx?key=" + login.Key); |
2.?suhow.com/sso.aspx
view sourceprint?
| 01 | var key = Request.QueryString["key"]; |
| 02 | var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key); |
| 05 | ????// key will be expired in 3 minutes |
| 06 | ????if (DateTime.Now.Minute - login.DateTime.Minute > 3) |
| 08 | ????????RemoveKey(login);?? // delete key from database |
| 09 | ????????Response.Redirect("http://login.susucms.com/login.aspx"); |
| 13 | ????????WriteAuthenticationCookie(); |
| 14 | ????????Response.Redirect("http://sigcms.com/sso.aspx?key=" + login.Key); |
3.?sigcms.com/sso.aspx
view sourceprint?
| 01 | var key = Request.QueryString["key"]; |
| 02 | var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key); |
| 05 | ????// key will be expired in 3 minutes |
| 06 | ????if (DateTime.Now.Minute - login.DateTime.Minute > 3) |
| 08 | ????????RemoveKey(login);?? // delete key from database |
| 09 | ????????Response.Redirect("http://login.susucms.com/login.aspx"); |
| 13 | ????????WriteAuthenticationCookie(); |
| 14 | ????????RemoveKey(login);?? // delete key from database |
| 15 | Response.Redirect("http://login.susucms.com/admin/default.aspx"); |
============================================================================================================ 發(fā)表評論 回復(fù) 引用 查看 ?? #1樓 willerce?
可以用js的方式調(diào)用各個域名。
可以生成cookie。
跳轉(zhuǎn)的方式在域名多的時候,問題就出來了,并且擴(kuò)展性不好。 回復(fù) 引用 查看 ?? #2樓 豫風(fēng)?
驗證端用cache保存登錄信息,其它站點(diǎn)使用session保存登錄標(biāo)志,其它站點(diǎn)每一個頁面都繼承一個基類(帶驗證功能的)。使用服務(wù)驗證 回復(fù) 引用 查看 ?? #3樓 Hunt?
又臭又長的八股文,哈哈,了解 回復(fù) 引用 查看 ?? #4樓 allentranks?
為啥不用iframe?
還得一個一個跳轉(zhuǎn)? 回復(fù) 引用 查看 ?? #5樓 鶴沖天?
跨應(yīng)用程序進(jìn)行 Forms 身份驗證:ASP.NET 支持在分布式環(huán)境中(跨單個服務(wù)器上的多個應(yīng)用程序或在網(wǎng)絡(luò)場中)進(jìn)行 Forms 身份驗證...http://msdn.microsoft.com/zh-cn/library/eb0zx8fc.aspx 回復(fù) 引用 查看 ?? #6樓 HoYO?
看不出來你跳轉(zhuǎn) 是因為你本機(jī)測試 速度當(dāng)然塊了 要是網(wǎng)速慢點(diǎn)的 你跳來跳去 用戶就迷茫了
總結(jié)
以上是生活随笔為你收集整理的单点登录在项目中的实现 转.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。