我可以从 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 会话吗的主要内容,如果未能解决你的问题,请参考以下文章
从请求管道深入剖析HttpModule的实现机制,有图有真相
将 HttpModule .Net 类库移植到 .Net Core Web API
未能从程序集“System.ServiceModel, Version=3.0.0.0”中加载类型“System.ServiceModel.Activation.HttpModule” 的解决办法