我正在开发一项功能,我的应用程序将不允许来自同一用户的多个活动登录。当用户从新计算机/浏览器登录时,先前的登录无效,用户将被重定向到旧计算机/浏览器上的登录页面。
我能够通过以下方式实现这一点:
1.在HttpApplicationState对象中为登录用户存储唯一的sessionid
2.每当用户登录此会话时,对象中的ID都会更新,因此始终存在最新的会话ID。
3.此会话ID也存储在客户端的cookie中
4.对于客户端发出的每个请求,我将此cookie值与Application值进行比较,如果不同,我将用户注销
5.为了比较每个请求中的会话ID,我为事件OnAuthenticated创建了一个HttpModule对象。
我的问题是,我可以以某种方式放弃我正在登录用户的会话吗?
答案 0 :(得分:2)
您可以在临时HttpHandler中实现IRequireSessionState,它会为您提供当前会话。这是一个SO问题/答案,提供了完整的来源。
答案 1 :(得分:2)
作为替代方案,您可以通过实现自定义逻辑来实现相同的目标。
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