asp.net-mvc - 首次加载时,在哪里/如何使用存储在 MVC 应用程序中的 cookie 数据中的用户填充 session ?

标签 asp.net-mvc session cookies login forms-authentication

我有一个 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/

相关文章:

java - Android:检查我的应用程序上的登录帐户

cookies - Render.com : HttpOnly Cookie not being set in browser storage when doing res. Web 服务之间的 cookie

asp.net-mvc - ClosedXML 中中心对齐和中心连续对齐之间的区别?

javascript - 在 Javascript 函数中获取 MVC Controller 名称

http - 为什么spring security会注销用户?

java - 了解 hibernate 中的 session.get 与 session.load 方法

php - 首次访问时未设置 Cookie

c# - 如果 header 不存在,如何获取空值

asp.net-mvc - 脚手架错误: deps. json不存在

php - Set-Cookie 存在于 header 响应中,但在浏览器中缺失