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

Posted

技术标签:

【中文标题】我可以从 HttpModule 实例中放弃 InProc ASP.NET 会话吗【英文标题】:Can I abandon a InProc ASP.NET Session from HttpModule instance 【发布时间】:2012-06-12 11:13:21 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

Can I access session state from an HTTPModule?

【讨论】:

IRequiresSessionState 中没有什么要实现的,它只是一个标记接口。而且AFAIR你不能将它用于HttpModule,它是用于HttpHandler @AntonioBakula - 看看这个! ***.com/questions/276355/… @M-J 不知道你是怎么得到这个的,但是即使在 .NET 1.1 msdn.microsoft.com/en-us/library/…987654323@ 中也定义了 IRequiresSessionState @ChrisGessler 我看了看,在最热门的答案中,IRequiresSessionState 设置为 HttpHandler @AntonioBakula - 这是绝对正确的!看看 HttpHandler 在 HttpModule 中是如何使用的。【参考方案2】:

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

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

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

当我在 HttpModule 实例中使用 HttpContext.Current.Session 时为空,因为它对于 HttpApplication.Session 或 HttpApplication.Contect.Session 为空。它说 SessionState 在这种情况下不可用。

以上是关于我可以从 HttpModule 实例中放弃 InProc ASP.NET 会话吗的主要内容,如果未能解决你的问题,请参考以下文章

NestJS:每个模块导入的 HttpModule 新实例

HttpModule的认识与深入理解

HttpModule 介绍

从请求管道深入剖析HttpModule的实现机制,有图有真相

将 HttpModule .Net 类库移植到 .Net Core Web API

未能从程序集“System.ServiceModel, Version=3.0.0.0”中加载类型“System.ServiceModel.Activation.HttpModule” 的解决办法