asp.net 多子網域名稱實現單點登入

來源:互聯網
上載者:User
asp.net 多子網域名稱實現單點登入作者:sithere 日期:2007-04-23 

問題:
網站有bbs.xxx.com / main.xxx.com / pay.xxx.com 這三個不同的二級站站,要實現任何一次層網域處登陸,其他各次層網域的站均登陸。
解決辦法:
設定cookie的domain屬性。
詳細介紹:
把儲存使用者登陸資訊的cookie的網域設定成一樣即可。
usercookie.Domain=".xxx.com"; 要注意,在網域名稱前必須要加一個"."。
這個設定在登陸和退出的時候都需要。
比較普遍的做法自然是用一個專門負責使用者登陸的類來管理這些事務。這樣其他登陸頁面只要調用這個類就可以,一通百通。
而如果你使用asp.net 2.0 和forms驗證,則有更簡單的辦法來完成這個設定。
web.config中添加了對域的支援,只要按照如下的設定即可: 程式碼<authentication mode="Forms">
<forms loginUrl="Login.aspx" domain=".xxx.com"  name=".AutoLinkEduSiteCookie"/>
</authentication>

domain:可選的屬性。
指定在傳出 Forms 身分識別驗證 Cookie 中設定的可選域。此設定的優先順序高於 httpCookies 元素中使用的域。 
此屬性是 .NET Framework 2.0 版中的新屬性。預設值為空白字串 ("")。 

注意
無論是哪一種辦法,cookie的name一定要相同。

引用內容所謂的單一登入是指使用者在一個網站如www.studyez.com登入後切換到另一個網站communty.studyez.com時也自動被community的Server判斷為已經登入,反過來,只要使用者在community.studyez.com登出後,切換到www.studyez.com時後www的Server也會判斷到這一使用者已經登出。

限制條件:
1.所有要求單點登入的網站間共用同一使用者資料庫,這點應該不需要任何解釋的吧。

2.要求所有網站在同一父網域名稱之下。這裡所說的單點登入是指在同一個網域名稱下不同子網域名稱之間的單點登入,直接的例子就是像這樣的網站之間的跨站單點登入: www.studyez.com, community.studyez.com, serach.studyez.com, mail.studyez.com, mms.studyez.com 等,他們屬於一個共同的父網域名稱studyez.com, 之所以有這麼多子網域名稱,是因為有很多子系統的時候用不同的子網域名稱對於開發、部署和管理都能方便很多,而且對於使用者訪問量很大的網站,可能每個子網域名稱都會有很多的伺服器來伺服。這是比較符合目前很多網站的模式和需求的。

對於非同一父網域名稱下的網域名稱間跨站登入,最好的方式是採用Passport的原理來實現,具體實現可以參考Passport文檔,因此不在本文討論範圍之內。

原理:

在不同的子網域名稱之間實現單點登入的最佳途徑是採用Cookie的Forms認證。他的原理簡單的來說,就是讓Forms Authentication產生的Cookie能夠跨網域名稱訪問。

先談一下Cookie的限制,對於一個任何Http Request來說,提交給Server端的時候,它能夠安全訪問的Cookie的網域名稱必須在這個HTTP Reuqest的網域名稱路徑中。舉例來說,發出一個http://communiy.corp.studyez.com/的請求時,隨著這個http request一塊發送到server端的cookies會自動包括所有以 community.corp.studyez.com, .corp.studyez.com, corp.studyez.com, .studyez.com, studyez.com為網域名稱的Cookies,這是由Cookie本身的規範所限制的,瀏覽器如果不是按照這個規範實現,那麼就會存在嚴重安全性漏洞,因為那樣的話意味著任何一個伺服器都可以讀到同一個使用者訪問別的網站時留下的Cookie。

根據上面所述Cookie的限制性,可以得出,對於前面www.studyez.com, community.studyez.com等網站的例子來說,就是想辦法如何讓Forms Authentication產生的Cookie的網域名稱限定為.studyez.com或者studyez.com,而不是預設的www.studyez.com 和 communty.studyez.com,這樣就使得單一登入需求的實現成為可能。

今天先寫這麼多,接下來幾天會繼續寫實現和局限性。

程式碼// 使用者 Cookie 儲存鍵
public const string CookieUser = "devin_cn_user";
// 使用者Cookie名稱鍵
public const string CookieUserName= "UserName";

/// <summary>
/// 設定使用者 Cookie 資訊
/// </summary>
/// <param name="UserName">使用者名稱稱</param>
/// <param name="CookieSave">Cookie有效時間選擇值</param>
private void SetCookie(string UserName,int CookieSave)
{
//設定Cookie值
HttpCookie cookie = new HttpCookie(CookieUser);
//設定域Cookie
cookie.Domain = ".devin.cn";
//設定使用者名稱稱
cookie.Values.Add(CookieUserName, UserName);
//設定Cookie身分識別驗證碼
cookie.Values.Add(CookieUserCode, this.CookieCode().ToString());

//根據選擇,設定Cookie有效時間
switch (CookieSave)
{
case 0:
cookie.Expires = DateTime.Now; //即時
break;
case 1:
cookie.Expires = DateTime.Now.AddDays(1); //一天
break;
case 2:
cookie.Expires = DateTime.Now.AddDays(7); //七天,一周
break;
case 3:
cookie.Expires = DateTime.Now.AddMonths(1); //一月
break;
case 4:
cookie.Expires = DateTime.Now.AddYears(1); //一年
break;
}

//在儲存 Cookie 資訊之前,刪除原有Cookie資訊以避免重複
HttpContext.Current.Response.Cookies.Remove(CookieUser);

//儲存Cookie資訊
HttpContext.Current.Response.SetCookie(cookie);

//登陸認證
FormsAuthentication.RedirectFromLoginPage(UserName,false); 
}

就是這一句吧
//設定域Cookie
cookie.Domain = ".devin.cn";

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.