2

我正在开发一项功能,我的应用程序将不允许来自同一用户的多次活动登录。当用户从新机器/浏览器登录时,之前的登录无效,用户被重定向到旧机器/浏览器上的登录页面。

我可以通过以下方式实现这一点:
1. 在 HttpApplicationState 对象中存储登录用户的唯一 sessionid
2. 每当用户登录时,此会话 id 都会在对象中更新,因此总是有最新的会话 id。
3. 此会话 ID 也存储在客户端的 cookie 中
4. 对于客户端发出的每个请求,我将此 cookie 值与应用程序值进行比较,如果不同,我将用户注销。
5. 为了比较每个请求中的会话 ID,我为事件 OnAuthenticated 创建了一个 HttpModule 对象。

我的问题是,我可以以某种方式放弃我正在注销用户的会话吗?

4

3 回答 3

2

作为替代方案,您可以通过实现自定义逻辑来做同样的事情。

  1. 维护当前登录用户的表。
  2. 每当用户成功登录时,只需为该用户插入一个新行以及他的用户名/用户 ID 和会话 ID。
  3. 检查此表中每个新登录的条目,如果存在,只需注销具有先前会话的用户并用新的 sessionId 替换旧条目,如果不存在,只需执行 #2 即创建新条目。
  4. 每次用户注销时,只需从该表中删除他的条目,同时破坏他的会话。
  5. 同时删除具有默认会话超时的用户的条目。

或者

  • 您可以通过管理user_login (user_id, login_status, session_id)所有用户的永久条目的表来执行相同操作,只需更新其字段 ( login_status (true/false) and session_id (String)) 而不是插入/删除。

第一种方法会减少表中的行数,但会增加插入/删除操作,同样会非常频繁地增加表的唯一 ID。

第二种方法作为更新操作的第一个原因对 DB 的命中率相同,但行数将固定为等于应用程序用户数。

于 2012-06-08T13:44:13.937 回答
2

您可以在临时 HttpHandler 中实现 IRequireSessionState,这将为您提供当前会话。这是一个提供完整来源的 SO 问题/答案。

我可以从 HTTPModule 访问会话状态吗?

于 2012-06-08T11:43:33.710 回答
0

您可以使用HttpContext.Current.Session并从 HttpModule 调用 HttpContext.Current.Session.Abandon() ,假设您将在 Session 对象初始化之后调用的事件中使用 Session ,例如HttpApplication.PreRequestHandlerExecute

于 2012-06-08T11:58:49.730 回答