ASP.NET MVC实现单用户登陆

 

 

 

 

 

如今许多网站都要求登陆后才能进行进一步的操做,当不容许多用户同时登陆一个账号时,就须要一种机制,当再登陆一个相同的账号时,前面登陆的人被挤下线,或者禁止后面的人登陆。这里实现的是前一种功能。html

网上有许多文章都有描述如何实现该功能,看过以后,想着本身也动手记录一下吧,这里是参考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html数据库

实现原理:在服务器端记录登陆的用户ID+SessionID,当重复登陆时,根据用户ID用新的SessionID替换掉旧的SessionID,在须要单用户登陆的操做时就能够判断SessionID是否匹配,不匹配则证实有其余人登陆了你的帐户,这时可要求从新登陆或其余的操做。服务器

实现步骤:一、登陆时记录登陆的用户ID+SessionID,可利用Application、Cache、数据库等。ide

     二、写一个过滤器用于判断当前的用户ID和SessionID跟服务器记录的是否匹配以及不匹配时进行的操做。post

       三、在Session过时或者退出系统时释放资源。网站

 

步骤1:spa

        private void GetOnline(string Name)
        {
            Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
            if (SingleOnline == null)
                SingleOnline = new Hashtable();

            Session["mySession"] = "Test";
            //SessionID
            if (SingleOnline.ContainsKey(Name))
            {
                SingleOnline[Name] = Session.SessionID;
            }
            else
                SingleOnline.Add(Name,Session.SessionID);

            System.Web.HttpContext.Current.Application.Lock();
            System.Web.HttpContext.Current.Application["Online"] = SingleOnline;
            System.Web.HttpContext.Current.Application.UnLock();
        }htm

说明:登陆时将用户名(惟一标识符便可)传给该方法,该方法实现记录用户ID以及SessionIDblog

 

步骤2:ip

  public class LoginActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Hashtable singleOnline = (Hashtable)filterContext.HttpContext.Application["Online"];
            // 判断当前SessionID是否存在
            if (singleOnline != null && singleOnline.ContainsKey(filterContext.HttpContext.User.Identity.Name))
            {
                if (!singleOnline[filterContext.HttpContext.User.Identity.Name].Equals(filterContext.HttpContext.Session.SessionID))
                {
                    filterContext.Result = new ContentResult() { Content = "<script>if(confirm('你的帐号已在别处登录,是否返回登录页面从新登录?')){window.location.href='/Authentication/Login';}else{window.close();}</script>" };
                }
            }
            base.OnActionExecuting(filterContext);
        }
    }
说明:该过滤器用于判断是否存在重复登陆的状况,过滤器怎么用这里就很少说了,若存在重复登陆,则执行if语句内的处理方式,这里的处理方式是弹出个确认框,固然你也能够直接跳转到登陆地址,看须要更改。

 

步骤3:

        protected void Session_End()
        {
            Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
            if (SingleOnline != null && SingleOnline[User.Identity.Name] != null)
            {
                SingleOnline.Remove(Session.SessionID);
                System.Web.HttpContext.Current.Application.Lock();
                System.Web.HttpContext.Current.Application["Online"] = SingleOnline;
                System.Web.HttpContext.Current.Application.UnLock();
            }
            Session.Abandon();
        }

说明:用于释放资源,该方法放置在Global.asax里面。

相关文章
相关标签/搜索