Asp.net中实现同一用户名不能同时登陆(单点登陆)

asp.net

Web项目中经常遇到的问题就是同一用户名多次登陆的问题,相应的解决办法也很多,总结起来不外乎这几种解决办法:将登陆后的用户名放到数据库表中;登陆后的用户名放到Session中;登陆后的用户名放到Application中;登陆后的用户名放到Cache中。一般的这几种方法都是登陆了之后,如果没有正常退出,第二次登陆将不被允许。这样一般都会存在一个问题:如果用户没有正常退出系统,那么他接下来继续登陆的时候,因为Session没有过期等问题,会被拒绝继续登陆系统,只能等待Session过期后才能登陆。本文介绍的方法是采用类似于MSN登陆的方法,第二次登陆时会把第一次的登陆注销掉,第一次登陆将会类似于MSN弹出:您的帐号已在别处被登陆,您被强迫下线的提示信息。
功能实现起来也比较简单:

登陆用户名密码验证通过之后输入以下代码:

Hashtable hOnline = (Hashtable)Application["Online"];
        if(hOnline != null)
        {
         IDictionaryEnumerator idE = hOnline.GetEnumerator();
         string strKey = "";
         while(idE.MoveNext())
         {
          if(idE.Value != null && idE.Value.ToString().Equals(UserID))
          {
           //already login           
           strKey = idE.Key.ToString();
           hOnline[strKey] = "XXXXXX";
           break;
          }
         }
        }
        else
        {
         hOnline = new Hashtable();
        }
       
        hOnline[Session.SessionID] = UserID;
        Application.Lock();
        Application["Online"] = hOnline;
        Application.UnLock();

用户登陆的时候将登陆用户名放在一个全局变量Online,Online为Hashtable结构,Key为SessionID,Value为用户名。每次用户登陆时均判断以下要登陆的用户名在Online中是不是已经存在,如果存在该用户名已经被登陆,将第一个人登陆的SessionID对应的用户名强制变更为XXXXXX,表示该登陆将被强制注销。

建立一个CommonPage页,系统中所有的页面都继承于CommonPage页,在CommonPage页的后台代码中添加如下代码:

override protected void OnInit(EventArgs e)
  {

Hashtable hOnline = (Hashtable)Application["Online"];
   if(hOnline != null)
   {
    IDictionaryEnumerator idE = hOnline.GetEnumerator();
    while(idE.MoveNext())
    {
     if(idE.Key != null && idE.Key.ToString().Equals(Session.SessionID))
     {
      //already login
      if(idE.Value != null && "XXXXXX".Equals(idE.Value.ToString()))
      {
       hOnline.Remove(Session.SessionID);
       Application.Lock();
       Application["Online"] = hOnline;
       Application.UnLock();
       MessageBox("你的帐号已在别处登陆,你被强迫下线!",Login.aspx);
       return false;
      }
      break;
     }
    }
   }

}

继承于CommonPage的页面在刷新时都要执行重载的OnInit中的代码,取出Online,找到该用户对应的SessionID,判断SessionID里对应的用户名是否变更,如果变更,就强迫下线,清掉Session,转到Login画面。

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

Hashtable hOnline = (Hashtable)Application["Online"];
   if(hOnline[Session.SessionID] != null)
   {
    hOnline.Remove(Session.SessionID);
    Application.Lock();
    Application["Online"] = hOnline;
    Application.UnLock();
   }

如果用户不正常退出后重登陆,因为重登陆的优先级大,不会影响用户的登陆,而不正常退出的用户占用的资源会在Session过期后自动清除,不会影响系统的性能。

 

时间: 2024-12-22 15:51:28

Asp.net中实现同一用户名不能同时登陆(单点登陆)的相关文章

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

最近找了一些单点登录的,发现了这篇文章,貌似还是可以实现的,先保存了. Web 项目中经常遇到的问题就是同一用户名多次登录的问题,相应的解决办法也很多,总结起来不外乎这几种解决办法: 将登录后的用户名放到数据库表中: 登录后的用户名放到Session中: 登录后的用户名放到Application中: 登录后的用户名放到Cache中.     一般的这几种方法都是登录了之后,如果没有正常退出,第二次登录将不被允许.这样一般都会存在一个问题:如果用户没有正常退出系统,那么他接下来继续登录的时候,因为

asp.net中登录页面用户名和密码与数据库中数据进行比对出错,求大神指导!!!!

问题描述 asp.net中登录页面用户名和密码与数据库中数据进行比对出错,求大神指导!!!! dr['AID']=112100011TextBox1.Text=1121000177 dr['apassword']=245fghTextBox2.Text=123456 dr['AID']=1121000177TextBox1.Text=1121000177 dr['apassword']= 123456TextBox2.Text=123456 用户名或密码不正确,请重新输入! 这是运行时页面打印出

asp.net中 web.config中连接用户名和密码是用什么加密的求解

问题描述 asp.net中 web.config中连接用户名和密码是用什么加密的求解 <add key="databaseconn_Server" value="173.231.20.198" /> <add key="databaseconn_DB" value="wws" /> <add key="databaseconn_User" value="5AC7376

ASP.NET中的session存储模式运用

在asp.net中的Session存储方式不象asp那样单一,一共提供了三种存储方式,由于最近一个2000多人使用的web软件出现了故障,用户每天早上在某一时刻出现难以登陆现象,接着Session丢值出现,只有重启IIS,或机器.这时程序恢复正常了. 整天都不会出现同样的问题 ,但是第二天依旧!这种现象持续了好几天,我检查了一下日志文件,高峰每秒访问人数大概20人左右,同时大概100多人在线,以后访问人数还会增加,为了解决这个怪问题,先从软件着手,故而三种方式都应用了一番. 打开web.conf

ASP.NET中session存储模式运用

在ASP.NET中的Session存储方式不象asp那样单一,一共提供了三种存储方式,由于最近一个2000多人使用的web软件出现了故障,用户每天早上在某一时刻出现难以登陆现象,接着Session丢值出现,只有重启IIS,或机器.这时程序恢复正常了.整天都不会出现同样的问题 ,但是第二天依旧!这种现象持续了好几天,我检查了一下日志文件,高峰每秒访问人数大概20人左右,同时大概100多人在线,以后访问人数还会增加,为了解决这个怪问题,先从软件着手,故而三种方式都应用了一番. 打开web.confi

如何在ASP程序中使用Telnet协议

程序 1 设计背景 越来越多的企业在建立自己的WEB站点时选择了基于微软的构架.Windows操作系统.IIS WEB Server和ASP技术得到了广泛的使用.但很多企业的网络中存在大量的UNIX主机,导致我们经常希望在浏览器中实现对UNIX系统资源的访问和控制,例如:通过浏览器查看UNIX系统中的用户进程.查看网络状态.甚至完成杀死一个进程这样的控制操作.以前我们可以通过Telnet程序远程登录到UNIX主机上,输入用户名和口令,并在命令行方式下输入命令.通过ASP中的ActiveX控件编程

在ASP应用中验证用户身份

    交互式的Web应用比那些只提供静态Web页面的站点要求考虑更多的安全问题.注册与密码是保护敏感信息最为常用的手段.由于ASP没有直接提供验证用户身份的方法,因此,用户必须执行登录过程以便应用系统保存和提取用户相关信息.    一.示例站点概貌    本文通过一个示例站点ASPSecurity说明ASP应用中注册与密码保护的一般实现过程.我们把用户信息保存在Web服务器上的一个Access97数据库中,DSN名称为   ASPSecurity.唯一的数据库表拥有以下字段:Signon(文本

揭开ASP.NET中Cookie编程的奥秘

asp.net|cookie|编程 简介 Cookie 为 Web 应用程序保存用户相关信息提供了一种有用的方法.例如,当用户访问您的站点时,您可以利用 Cookie 保存用户首选项或其他信息,这样,当用户下次再访问您的站点时,应用程序就可以检索以前保存的信息. 本文概要介绍 Cookie 在 ASP.NET 应用程序中的应用,为您展示在 ASP.NET 中应用 Cookie 的技术细节,例如编写 Cookie.然后再读取它们.同时,还将为您介绍 Cookie 的各种特性和各种特殊情况,以及 A

ASP开发中存储过程应用详解

存储过程|详解 ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过.我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事.对于简单的应用,这些资料也许是有帮助的,但仅限于此,因为它们根本就是千篇一律,互相抄袭,稍微复杂点的应用,就全都语焉不详了. 现在,我基本上通过调用存储过程访问SQL Server,以下的文字都是实践的总结,希望对大家能有帮助. 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 定义总是很