【问题标题】:Access Membership User On Session End在会话结束时访问会员用户
【发布时间】:2013-11-20 21:15:39
【问题描述】:
我目前正在尝试编写一些代码来在用户放弃会话(通过超时或注销)后进行一些整理,但是我想访问 User 对象,以便我知道会话属于谁到。
不幸的是 HttpContext 为空,所以我无法直接访问 HttpContext.User 或 HttpContext.User.IsInRole 甚至 auth cookie。我了解这背后的原因,但想知道在会话超时时是否有其他方法可以访问此信息?
这与在会话中复制一些信息的明显答案不同。
谢谢。
【问题讨论】:
标签:
asp.net-mvc
asp.net-membership
session-state
membership-provider
httpcontext
【解决方案1】:
您可以使用 Global.asax 的 Session_End 事件。 Session 过期时会自动调用 Session_End 事件。
问题是在没有当前请求的情况下调用 Session_End 事件。结果,HttpContext.Current 在 Session_End 内为空。
如果您想获取用户信息,您需要在用户成功登录后立即将其保存在 Session 中。
private void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set
// to StateServer or SQLServer, the event is not raised.
var userName = Session["UserName"];
var sessionId = Session.SessionID;
}
【解决方案2】:
没有任何东西可以将会员用户与会话联系起来。
当用户手动注销时,在您清除他们的会话之前,您可以获取他们的用户信息。
但是,如果用户让浏览器保持打开状态并且服务器上的会话超时,您将不知道该用户是谁,因此无法为他们整理。
在服务器上,您可能需要跟踪用户上次交互的时间,然后运行作业以整理一段时间未交互并被视为已注销的用户。