日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单点登录在项目中的实现 转.

發(fā)布時間:2024/9/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单点登录在项目中的实现 转. 小編覺得挺不錯的,現(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?
01if (IsLogin)
02{
03????var login = new CrossDomainLogin
04????{
05????????Key = Guid.NewGuid().ToString(),
06????????CreateTime = DateTime.Now
07????};
08????DataContext.CrossDomainLogins.InsertOnSubmit(login);
09????DataContext.SubmitChanges();
10??
11????WriteAuthenticationCookie();
12????Response.Redirect("http://suhow.com/sso.aspx?key=" + login.Key);
13}

2.?suhow.com/sso.aspx

view sourceprint?
01var key = Request.QueryString["key"];
02var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key);
03if (login != null)
04{
05????// key will be expired in 3 minutes
06????if (DateTime.Now.Minute - login.DateTime.Minute > 3)
07????{
08????????RemoveKey(login);?? // delete key from database
09????????Response.Redirect("http://login.susucms.com/login.aspx");
10????}
11????else
12????{
13????????WriteAuthenticationCookie();
14????????Response.Redirect("http://sigcms.com/sso.aspx?key=" + login.Key);
15????}
16}
17else
18{
19????// ....
20}

3.?sigcms.com/sso.aspx

view sourceprint?
01var key = Request.QueryString["key"];
02var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key);
03if (login != null)
04{
05????// key will be expired in 3 minutes
06????if (DateTime.Now.Minute - login.DateTime.Minute > 3)
07????{
08????????RemoveKey(login);?? // delete key from database
09????????Response.Redirect("http://login.susucms.com/login.aspx");
10????}
11????else
12????{
13????????WriteAuthenticationCookie();
14????????RemoveKey(login);?? // delete key from database
15     Response.Redirect("http://login.susucms.com/admin/default.aspx");
16????}
17}
18else
19{
20????// ....
21}
============================================================================================================ 發(fā)表評論 2208516 回復(fù) 引用 查看 ?? #1樓 2011-09-27 00:25 willerce? 可以用js的方式調(diào)用各個域名。
可以生成cookie。
跳轉(zhuǎn)的方式在域名多的時候,問題就出來了,并且擴(kuò)展性不好。
回復(fù) 引用 查看 ?? #2樓 2011-09-27 08:27 豫風(fēng)? 驗證端用cache保存登錄信息,其它站點(diǎn)使用session保存登錄標(biāo)志,其它站點(diǎn)每一個頁面都繼承一個基類(帶驗證功能的)。使用服務(wù)驗證 回復(fù) 引用 查看 ?? #3樓 2011-09-27 08:32 Hunt? 又臭又長的八股文,哈哈,了解 回復(fù) 引用 查看 ?? #4樓 2011-09-27 08:53 allentranks? 為啥不用iframe?
還得一個一個跳轉(zhuǎn)?
回復(fù) 引用 查看 ?? #5樓 2011-09-27 08:56 鶴沖天? 跨應(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樓 2011-09-27 09:03 HoYO? 看不出來你跳轉(zhuǎn) 是因為你本機(jī)測試 速度當(dāng)然塊了 要是網(wǎng)速慢點(diǎn)的 你跳來跳去 用戶就迷茫了

總結(jié)

以上是生活随笔為你收集整理的单点登录在项目中的实现 转.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。