我可以从HttpModule实例中放弃InProc ASP.NET会话吗?

时间:2012-06-08 11:35:56

标签: .net session c#-3.0 session-state session-cookies

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

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

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

3 个答案:

答案 0 :(得分:2)

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

Can I access session state from an HTTPModule?

答案 1 :(得分:2)

作为替代方案,您可以通过实现自定义逻辑来实现相同的目标。

  1. 维护当前登录用户的表格。
  2. 每当用户成功登录时,只需为此用户插入一个新行及其用户名/ userId和sessionId。
  3. 检查此表中每个新登录的条目,如果存在则只注销具有上一个会话的用户并将旧条目替换为新的sessionId,如果不存在则只执行#2即创建新条目。
  4. 每次用户退出时,只需在销毁会话时从此表中删除其条目。
  5. 同时删除默认会话超时用户的条目。
  6. OR

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

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

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

答案 2 :(得分:0)

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