最近做了个asp.net程序,根据要求,某用户名只能在x台机器上登陆(x为授权同时登陆数量),不允许超过x数量的用户再使用该用户名登陆。
以前有人认为可以使用数据库某个字段来管理这个权限,但是数据库的弱点在于用户关闭浏览器时,不进行任何操作。
我想了个办法,使用Application和Session。大体思路是这样的:
每个登陆的客户端,都有一个SessionID,这些SessionID是唯一性的。
登陆程序先判断用户名密码的正确性,再从数据库中取出该用户名被授权的客户端数,存在一个叫username_count的Application中。
if(LoginCheck()==true)
{
Application[username+"_count"]=objUser.GetAuthCount();
}
用户名密码验证后:
Session["user"]=username; //用户名存Session
if(Application[username+"_login"]==null)
{
//这个用户名之前还没登陆过
string id=Session.SessionID.ToString();
ArrayList arr=new ArrayList();
arr.Add(id);
Application[username+"_login"]=arr;
}
else
{
//该用户名已经登陆过
ArrayList arr=new ArrayList();
arr=(ArrayList)Application[username+"_login"];
if(arr.Lenth<Convert.ToInt16(Application["username+"_count"]))
{
//已登陆数比授权数少
string id=Session.SessionID.ToString();
arr.Add(id);
Application[username+"_login"]=arr;
}
else
{
//已登陆数大于等于授权数
arr.RemoveRange(0,1); //踢掉第一个登陆的客户端
string id=Session.SessionID.ToString(); //获取当前客户端的SessionID
arr.Add(id);
Application[username+"_login"]=arr; //将最新的登陆授权表ArrayList加给Application
}
}
以上是登陆时的设置。WebForm执行时,要判断是否有权限访问时,执行:
if(Session["user"]==null)
Response.Redirect("login.aspx");
//上面是判断是否登陆过
//下面的代码是判断是否超过授权数
string id=Session.SessionID.ToString();
ArrayList arr=new ArrayList();
arr=(ArrayList)Application[username+"_login"];
if(arr.Contains(id)==false) //当前的SessionID不在登陆列表中
Response.Redirect("logout.aspx") //退出系统
以上是这个授权判断的部分代码。主要思路就是:使用ArrayList存放已登陆的客户端SessionID。当登陆数超过已授权的数量时,踢出最早登陆者。当那个最早登陆者刷新页时,程序会发现他的SessionID不在ArrayList中,即拒绝该客户端访问。