Asp.Net MVC 实现同一用户名不能同时登录(单点登录)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013924731/article/details/85258352

Web 项目中经常遇到的问题就是同一用户名多次登录的问题,网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html

实现原理:在服务器端记录登录的用户ID+SessionID,当重复登录时,根据用户ID用新的SessionID替换掉旧的SessionID,在需要单用户登录的操作时就可以判断SessionID是否匹配,不匹配则证明有其他人登录了你的账户,这时可要求重新登录或其他的操作。

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

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

       3、在Session过期或者退出系统时释放资源。

步骤一:验证账号密码后,调用下面的方法,用于存储用户ID和sessionID

private void GetOnline(string Name)
{
	Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
	if (SingleOnline == null)
		SingleOnline = new Hashtable();
	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();
}

步骤二:重写定义过滤器方法,验证该账号是否已经登录

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>alert('您的帐号已在别处登录 ,将被迫下线(请保管好自己的账号密码)!');window.location.href='/Login/Login'</script>" };
			}
		}
		base.OnActionExecuting(filterContext);
	}
}

说明:该过滤器用于判断是否存在重复登录的情况,若存在重复登录,则执行if语句内的处理方式,被挤下线,跳转登录页面。(此处的过滤器类似于一个通用类,判断是否登陆)。在涉及视图的控制器方法上方定义使用该过滤器,这样只要刷新视图页面就会调用该方法。

步骤三:在Session过期或者退出系统时释放资源,在Global.asax文件中的Session_End中添加如下代码:

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();
}

上述步骤完成之后,功能已基本实现。上图以示说明:

展开阅读全文

没有更多推荐了,返回首页