把下面這段代碼放在登錄用戶驗證以后:
//用戶登錄驗證通過后判斷用戶是否重復登錄 public void SingleUserCheck(string userid) { HttpContext httpContext = System.Web.HttpContext.Current; Hashtable userOnline = (Hashtable)httpContext.Application["Online"]; if (userOnline != null) { int i = 0; while (i < userOnline.Count) { IDictionaryEnumerator idE = userOnline.GetEnumerator(); string strKey = string.Empty; while (idE.MoveNext()) { if (idE.Value != null && idE.Value.ToString().Equals(userid)) //如果當前用戶已經登錄, { strKey = idE.Key.ToString(); userOnline[strKey] = "XXXXXX"; //將當前用 戶已經在全局變量中的值設置為XX break; } } i++; } } else { userOnline = new Hashtable(); } userOnline[httpContext.Session.SessionID] = userid; //初始化當前用戶的 sessionid httpContext.Application.Lock(); httpContext.Application["Online"] = userOnline; httpContext.Application.UnLock(); }
添加驗證特性類,自動讓已經登錄的用戶下線:
using System.Collections; namespace System.Web.Mvc { public class SingleUserAuthorize:AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { Hashtable userOnline = (Hashtable)(httpContext.Application["Online"]); if(userOnline!=null) { IDictionaryEnumerator idE=userOnline.GetEnumerator(); string strkey=string.Empty; if(userOnline.Count>0) { while(idE.MoveNext()) { //登錄時判斷保存的session是否與當前頁面的session相同 if (userOnline.Contains(httpContext.Session.SessionID)) { if (idE.Key != null && idE.Key.ToString().Equals(httpContext.Session.SessionID)) { //判斷當前session保存的值是否為被注銷值 if (idE.Value != null && "XXXXXX".Equals(idE.Value.ToString())) { //驗證被注銷則清空session userOnline.Remove(httpContext.Session.SessionID); httpContext.Application.Lock(); httpContext.Application["Online"] = userOnline; httpContext.Response.Write("<script>alert('你的帳號在別處登錄,你被強迫下線!');location.href='/Load';</script>"); httpContext.Response.End(); return false; } } } else { return false; } } return true; } else { return false; } } return false; } } }
驗證的時候在控制器里添加:
[SingleUserAuthorize]
最后在Global.asax.cs里添加如下代碼:
//單點登錄代碼開始 protected void Session_Start(object sender, EventArgs e) { } protected void Session_End(object sender, EventArgs e) { Hashtable hOnline = (Hashtable)Application["Online"]; if (hOnline[Session.SessionID] != null) { hOnline.Remove(Session.SessionID); Application.Lock(); Application["Online"] = hOnline; Application.UnLock(); } } //單點登錄代碼結束