單點登錄,這種在網絡非常常見,在這里討論的是實現同一主域下的子站間的單點登錄,同樣也適用于使用負載均衡后站點的登錄識別。
.net,討論基于MVC環境下的,假設域名為 wlm.so。
基礎條件:
1.cookie共享
2.FormsAuthentication加密
3.服務器端處理
還是一樣,從原理開始:
原理非常簡單,所有登錄后,將用戶的標識放在客戶端的cookie里面,通過cookie共享,每次請求服務器端將客戶端發送的cookie直接當成標識來識別用戶。
這個過程中安全就非常重要了,怎么做到安全呢?
FormsAuthentication認證,FormsAuthenticationTicket票據加密。
1.cookie共享
假設主域為wlm.so,子域為a.wlm.so以及b.wlm.so。
那么在服務器端寫入cookie時必須為cookie指定主域。代碼如下:

那么當cookie未過期時,打開a.wlm.so或者打開b.wlm.so時該cookie就會相應的被提交。
2.FormsAuthentication加密
假設,我們在cookie寫上用戶名的話,那將是非常的不安全,因此使用FormsAuthentication驗證方式,通過FormsAuthentication創建驗證票據,將票據保存在客戶端。
首先上代碼:
webconfig配置票據代碼:

票據創建與寫入代碼,login.LoginName是登錄名,也是用戶標識:

通過創建票據后,寫入客戶端cookie,如果需要記錄登錄信息,請加上cookie過期時間即可。
通過上述創建的票據將被寫在cookie中,訪問主域下的二級網站時均會被提交。但是不同IIS該票據加密密鑰是不一樣的,因此無法識別,需要配置密鑰讓不同服務器上的IIS都能識別驗證票據。
3.FormsAuthentication密鑰生成與配置
只需要在webconfig中增加配置即可:

該配置中附帶著加密密鑰與解密密鑰以及加密方式,密鑰不是隨意生成的,附帶生成代碼:
點擊下載生成代碼
4.服務器識別到用戶標識后,需要進行session記錄,或者其他記錄方式即可通過通常代碼實現,這里不做討論。服務器端獲取用戶登錄名如下:
a)判斷用戶是否已經登錄
if(httpContext.User.Identity.IsAuthenticated){
//已經登錄
}
b)獲取登錄名
string name=HttpContext.Current.User.Identity.Name;//即前文中的login.loginName
附上代碼:
HttpCookie cookie = new System.Web.HttpCookie("cookiename", "cookievalue");cookie.Domain = "wlm.so";System.Web.HttpContext.Current.Response.Cookies.Add(cookie);FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,// 版本號。u.Id,// 與身份驗證票關聯的用戶名。DateTime.Now,// Cookie 的發出時間。DateTime.Now.AddMinutes(1000),// Cookie 的到期日期。login.Persistent != 0,// 如果 Cookie 是持久的,為 true;否則為 false。login.LoginName//寫入用戶名稱);HttpCookie cookie =new System.Web.HttpCookie(FormsAuthentication.FormsCookieName,FormsAuthentication.Encrypt(ticket));cookie.Domain = "wlm.so";System.Web.HttpContext.Current.Response.Cookies.Add(cookie);return LoginState.Success;<authentication mode="Forms"> <forms name="FormsAuthCookie"path="/" loginUrl="~/Login"domain="wlm.so" /></authentication><machineKey validationKey="****"decryptionKey="***"validation="SHA1"/>
新聞熱點
疑難解答