我有一个 session 变量,用于存储我的整个用户对象,当此人使用表单例份验证(使用默认的 MVC 提供的登录)登录我的站点时,我将 Session 变量设置为用户对象,如下所示:
FormsAuthentication.SetAuthCookie(user.Username, model.RememberMe);
SessionUtil.User = user;
我的所有页面都设置为从此 Session 对象工作,但是当他们选中“记住我”框时会出现问题。关闭他们的浏览器,重新打开浏览器,然后再次访问我的网站。 session 在这一点上很清楚,他们没有登录,但我的站点仍然记得他们是谁,但是所有在 session 中断时引用我的用户对象的页面。
我正在寻找一种用适当的数据填充 Session 用户对象的方法,以便在上述情况下,无论在访问我的网站后“记住”他们首先点击哪个页面, session 对象都不会为空。哪里有做这件事的好地方?在应用程序启动?在 SessionUtil 中(现在它只是 session 变量的静态包装器)? Controller 上的基类?我该怎么做?我已经编写了使用户脱离用户名的逻辑。
编辑:那么 application_start 似乎不是一个好地方,因为这样做:
if (User != null)
{
SessionUtil.User = EntityServiceFactory.GetService<UserService>().GetUser(User.Identity.Name);
}
在方法中并不能阻止问题的发生。我尝试在 if 检查中执行 User.Identity.Name 然后我得到了一个空引用异常,但我仍然记得并在页面实际加载时登录。
根据 Splash-X 的评论在 Global.asax 中尝试了以下内容:
protected void Application_BeginRequest()
{
if(User != null)
{
SessionUtil.User = EntityServiceFactory.GetService<UserService>().GetUser(User.Identity.Name);
}
}
此事件正在运行每个请求,但 User 始终为空。但我没有得到的是默认的 _LogOnPartial 代码:
@if(Request.IsAuthenticated) {
<text><strong>@User.Identity.Name</strong> [@Html.ActionLink("Profile", "Profile", "Account")]
[ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
}
仍然显示我已登录,并且用户名在那里显示良好。
最佳答案
您绝对不想使用 application_start - 这只会运行一次,一开始您的应用程序就会启动。您可能正在寻找的是 session_start,它将在新 session 的第一个请求时运行:
void Session_Start(object sender, EventArgs e) {
// set SessionUtil.User here
}
我认为您的这个用户对象必须在哪里刷新没有明确的答案。如果我必须选择,我可能会在您的 SessionUtil.User getter 中进行。像这样的东西(警告,我没有编译或测试这个)
public User User
{
get
{
if (Session["user"] != null)
return Session["user"] as User;
var user = GetUser(); //however you normally get current user
Session["user"] = user;
return user;
}
}
最终结果是您不可能请求 session 实用程序的 User 属性为空。
编辑 :只是要清楚, session 与被“记住”无关。您的站点知道您已登录并通过身份验证,因为您拥有 ASP.NET 授权 cookie。这与 Session 无关。 Session 只是一个内存存储,适用于每个唯一用户,无论是否经过身份验证。
关于asp.net-mvc - 首次加载时,在哪里/如何使用存储在 MVC 应用程序中的 cookie 数据中的用户填充 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9318223/