控制用户';asp.net中的联机状态

控制用户';asp.net中的联机状态,asp.net,session,Asp.net,Session,我的应用程序我不想在同一时间登录相同的用户名,所以我有和想法,但我不确定它是否正确 1) 当用户登录时,更新状态(数据库中用户表中的“isOnLine”列),并在会话中保存其登录时间,如: 在登录方法中: DateTime ltime=Datetime.now(); Dbservice.executeSql(update User set(isOnLine,lastLoginTime) value("1",ltime)); Session["logintime"]=ltime; 当其他用户

我的应用程序我不想在同一时间登录相同的用户名,所以我有和想法,但我不确定它是否正确

1) 当用户登录时,更新状态(数据库中用户表中的“isOnLine”列),并在会话中保存其登录时间,如:

在登录方法中:

DateTime ltime=Datetime.now();

Dbservice.executeSql(update User set(isOnLine,lastLoginTime) value("1",ltime));

Session["logintime"]=ltime;
当其他用户尝试登录时,请检查该表以查看该用户的状态是否已登录。如果已登录,请将“isOnline”设置为“0”,然后他可以立即登录

2) 在每个受保护页面的page_Onload()方法中,检查会话中的登录时间是否等于以db为单位的时间:

string logtime=Dbservice.executeSelect("select lastLoginTime from user where xxxxx").Rows[0]["lastLoginTime"];

if(!Session["logintime"]==logtime){

  //this user should offline now,redirect it to the login page

}
我不知道我的方法对不对

另外,我必须在每个受保护页面的page_onLoad方法中编写检查逻辑,所以有这么多重复代码,有没有办法避免这种情况

因为我们网站中的所有页面都受保护

谢谢

更新:

不允许两个用户同时联机,但允许具有正确密码的后一个用户强制前一个用户脱机。例如:

使用“用户名=账单”和 “password=000”,那么他现在在线了

然后user2尝试使用登录 “用户名=账单”和 “password=123”,因为他的密码是 无效,因此他的请求被拒绝

user3尝试使用登录 “用户名=账单”和 “password=000”,因为他的密码是 有效,所以他有选择权 用户1处于脱机状态


在这种情况下,当后一个用户成功登录时,前一个用户的会话也存在,因此我必须根据会话中的“登录时间”检查它是否在线。

对于检查用户是否已经在线的逻辑,由于所有页面都受到保护,我可能想将其放入
Global.asax应用程序\u AcquisiteRequestState
事件中。

为了检查用户是否已在线,我可能想将其放入
Global.asax应用程序\u AcquisiteRequestState
事件中,因为所有页面都受到保护。

如果您不打算使用web farm(或web garden)场景,然后您可以使用内存结构来跟踪登录的用户。例如,字典类型的静态全局变量(以线程安全的方式访问)

对于通用健壮的解决方案,您需要将此信息保存在数据库中(如您所示)。我不理解根据会话检查登录时间的目的。对于正确的解决方案

  • 您需要一个跟踪用户会话的数据库表。重要字段将是上次访问时间和活动/非活动状态
  • 登录时,如果数据库中存在同一用户的活动会话,则用户无法登录
  • 在特定超时后将会话标记为非活动的作业。此超时必须比web服务器会话超时稍大(例如x分钟)
  • 定期刷新应用程序代码,以重置数据库中上次访问的值,这样作业就不会将会话标记为非活动状态
  • 由于db time-out=web服务器time-out+x,您可以将刷新加入x分钟,从而减少数据库行程。例如,假设x=3分钟,则3分钟内的所有请求都不会修改数据库中上次访问的时间(通过减少数据库行程)。您可以在会话状态下跟踪上次数据库更新时间,并在每次请求中根据此值检查是否需要更新数据库(即当前时间>上次数据库更新+x,然后更新数据库中上次访问的值)

  • 第三步(作业)是可选的,因为您可以修改签入2,以查看登录尝试是否在上次访问时间的n分钟(其中n>会话超时)之后。

    如果您不打算使用web场(或web花园)然后,您可以使用内存结构跟踪已登录的用户。例如,字典类型的静态全局变量(以线程安全方式访问)

    对于通用健壮的解决方案,您需要将此信息保存在数据库中(如您所示)。我不理解根据会话检查登录时间的目的。对于正确的解决方案

  • 您需要一个跟踪用户会话的数据库表。重要字段将是上次访问时间和活动/非活动状态
  • 登录时,如果数据库中存在同一用户的活动会话,则用户无法登录
  • 在特定超时后将会话标记为非活动的作业。此超时必须比web服务器会话超时稍大(例如x分钟)
  • 定期刷新应用程序代码,以重置数据库中上次访问的值,这样作业就不会将会话标记为非活动状态
  • 由于db time-out=web服务器time-out+x,您可以将刷新加入x分钟,从而减少数据库行程。例如,假设x=3分钟,则3分钟内的所有请求都不会修改数据库中上次访问的时间(通过减少数据库行程)。您可以在会话状态下跟踪上次数据库更新时间,并在每次请求中根据此值检查是否需要更新数据库(即当前时间>上次数据库更新+x,然后更新数据库中上次访问的值)

  • 第三步(作业)是可选的,因为您可以修改签入2,以查看登录尝试是否在上次访问时间的n分钟(其中n>会话超时)后进行。

    @VinayC:这是我的错,我更新了我的问题。请检查。:)@hguser,如果您仅在成功登录后才在数据库中创建条目,则无需进行检查。但在步骤中“登录时,如果数据库中存在同一用户的活动会话,则用户无法登录”,这取决于,如果他的密码正确,他可以强制登录的用户脱机。@hguser,您的意思是说,如果用户登录到系统中,则其上一个会话将被禁用?通常不采取这种方法(例如,银行网站,但当然,您可以根据需要选择不同的方法)-其中一个原因是实施成本高昂-对于每个请求,y