100分请教:在asp.net提供的成员管理中如何实现防止同一用户同时在不同地方登录?

skykevin 2008-08-20 10:01:40
在asp.net提供的成员管理中,如何实现同一帐号在一个地方登录后,如果其它地方有同一帐号登录,会弹出对话框提醒:有用户用同一帐号登录。
...全文
229 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
skykevin 2008-09-02
  • 打赏
  • 举报
回复
up
skykevin 2008-08-25
  • 打赏
  • 举报
回复
sp1234的方法可行,就是频繁连接数据库,有没有更理想的方法?
lh39269083 2008-08-21
  • 打赏
  • 举报
回复
在数据库中建立一张表 包含必要的登陆信息 和 在线时间,
1.登陆之前先检查用户是否已经登陆,
2.如果该用户没登陆,则可以登陆,并开始记录在线时间
3,如果已经有用户登录,则给出相应提示。
4,用户正常退出,删除该用户的登陆信息
5,用户非正常退出,该用户被锁定 要过“一段时间"才可以登录,一定时间后删除表中该用户的登陆信息。(这个时间应该与Session保存的用户信息的时间相同)

我的一个项目就是这样做的。


skykevin 2008-08-21
  • 打赏
  • 举报
回复
up
wuxiaoqqqq 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sp1234 的回复:]
哦,我有看了一下我的回复。补充一下关于在asp.net下“几十秒钟内记录客户离线”的设计。

在passport对象中需要有字段记录“最后访问时间”。

所有页面页面需要定时访问服务器,例如在UpdataPanel中加入一个Timer控件(例如20秒钟响应一次),这应该设计为一个ascx,然后用鼠标拖入每一个aspx即可。并且页面在 !IsPostback 状态下(第一次访问)时当然也需要执行同样的后台功能。这个后台功能就是找到passport并刷新数据…
[/Quote]
这样的话等于20秒需要刷一次,如果用户多的话会不会负担过重呢?
anncesky 2008-08-21
  • 打赏
  • 举报
回复
以前设计单点登陆都是用application存个table

table记录登陆用户主键信息,用户登陆时在table里查找

像断电,非法关机目前好像还没有很好的办法,只能用sessiontimeout判断
zhpfeiqq 2008-08-21
  • 打赏
  • 举报
回复
ding
sp1234延伸的很远。。。
suyiming 2008-08-21
  • 打赏
  • 举报
回复
ding
wlm1314 2008-08-21
  • 打赏
  • 举报
回复
学习
xbfitliu 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cftea 的回复:]
我刚才翻了一下配置文件,ASP.NET 自带的 SqlMembershipProvider 没有这个功能。
[/Quote]


没有可以自己写啊,Membership类中肯定有判断一个用户是否活动的方法。如果该用户活动那就是登录了。
yagebu1983 2008-08-21
  • 打赏
  • 举报
回复
不错!!
tonyze 2008-08-21
  • 打赏
  • 举报
回复
关注一下
  • 打赏
  • 举报
回复
哦,我有看了一下我的回复。补充一下关于在asp.net下“几十秒钟内记录客户离线”的设计。

在passport对象中需要有字段记录“最后访问时间”。

所有页面页面需要定时访问服务器,例如在UpdataPanel中加入一个Timer控件(例如20秒钟响应一次),这应该设计为一个ascx,然后用鼠标拖入每一个aspx即可。并且页面在 !IsPostback 状态下(第一次访问)时当然也需要执行同样的后台功能。这个后台功能就是找到passport并刷新数据库中它的“最后访问时间”。

在后台判断用户操作的权限时,如果根据cookie中记录的passport键值在数据库中找不到记录,或者虽然找到但是最后访问时间超时了(例如超过了50秒),那么就抛出“您的访问凭据已经过期”信息。至于何时创建passport,何时删除,我前边已经写出来了。
  • 打赏
  • 举报
回复
或者不小心关闭的应用程序 --> 或者不小心终止了浏览器进程
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lh39269083 的回复:]
在数据库中建立一张表 包含必要的登陆信息 和 在线时间,
1.登陆之前先检查用户是否已经登陆,
2.如果该用户没登陆,则可以登陆,并开始记录在线时间
3,如果已经有用户登录,则给出相应提示。
4,用户正常退出,删除该用户的登陆信息
5,用户非正常退出,该用户被锁定 要过“一段时间"才可以登录,一定时间后删除表中该用户的登陆信息。(这个时间应该与Session保存的用户信息的时间相同)

我的一个项目就是这样做…
[/Quote]

我认为第5不太实用。如果我的机器出现“蓝屏”了,或者不小心关闭的应用程序或者注销了当前桌面用户,可是我需要立刻再进入系统处理,那么我就要等待20分钟以后?
  • 打赏
  • 举报
回复
客户端应该在类似“断点”等情况下 --> 客户端应该在类似“断电”等情况下

如果你认为基于互联网的应用下“也许这种情况不太多”的想法,那么设计的东西就会很不成熟。在互联网环境下,不像在一个单位的局域网下那么容易维护,不能随便用这类想法简化设计。
  • 打赏
  • 举报
回复
单点登录系统是一个相当通用的需求,因此不能在系统设计中引入“SessionID”之类的概念来标识用户的会话,而应该用一个通用的概念。单点登录系统的逻辑和数据库等同时满足不同客户端平台,例如同时满足asp.net、silverlight、javascript、java等客户端,甚至包括多种手机客户端的访问。满足多中客户端平台,才能体现单点登录的概念。

应用中一个客户登录后,系统对此后的操作权限判断不是依赖于客户资料,而是依赖于登录所得到的passport资料。当客户登录时,系统分配一个新的passport(哪怕只是一个简单的整数编号),然后应用再操作任何数据时后台系统都是根据它的passport数据来计算出权限。如果你的登录管理系统逻辑约束为同一时间一个用户只能有一个passport,那么就是单点登录;如果为2个,就是允许最多2个客户端使用同一个帐号登录。

例如,一个用户使用asp.net登录,同时另外一个客户使用自己的手机登录,那么单点登录系统就会发现当前客户的passport还存在而拒绝分配passport;或者它可以删除先前的passport而使得asp.net程序在随后的访问中出先“凭据过期”错误。

客户端应该在类似“断点”等情况下,服务端依然能够及时记录用户离线状态。例如用户在网页上“发呆”超过20分钟,或者干脆去访问其它网站了,服务器当然就应该把客户记录为离线。一般来说,服务器端应该在客户离线几十秒钟之内就记录离线状态,而不是等着客户端应用程序去执行“正常退出”功能。

另外,如果客户端使用同样的passport启动不同的应用,例如一个asp.net程序使用自己得到passport启动了另一个asp.net程序,甚至另一个WinForm桌面程序,那么本地的这3个应用就使用同一个帐号作为单点登录进去了。后两个应用无需再显示用户登录界面。这也是单点登录系统应该涉及到的功能。
yuchangmao 2008-08-20
  • 打赏
  • 举报
回复
在服务端记录登录成功的人员ID,下一个人登录时进行比对
Masic_send 2008-08-20
  • 打赏
  • 举报
回复
我最近刚做的,单用户单登陆的,在网上查了很多的资料,一般都是依赖于数据库,就是一登陆是TRUE,正常退出就FLASE,非正常的时候就在Global.asax把FLASE写进数据库!
曾经见网上提供了一种像QQ的那种,就是一个用户登陆 ,下一个用户登陆的时候会顶掉上一个!不过方法看上去很复杂,没用!
lihongdian 2008-08-20
  • 打赏
  • 举报
回复
可以查查单点登陆的设计方法
加载更多回复(2)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧