asp.net-mvc – 首次加载时,如何/如何在MVC app中使用存储在cook
我有一个会话变量来存储我的整个用户对象,当这个人使用表单身份验证登录我的站点时(使用默认的MVC提供的登录)我将Session变量设置为用户对象,如下所示:
FormsAuthentication.SetAuthCookie(user.Username,model.RememberMe); SessionUtil.User = user; 我的所有页面都设置为使用此Session对象,但是当他们检查“记住我”框时会出现问题.关闭浏览器,重新打开浏览器,然后再次访问我的网站.此时会话很清楚,他们没有登录,但我的网站仍记得他们是谁,但是会话中断了所有引用我的用户对象的页面. 我正在寻找一种方法来使用适当的数据填充Session用户对象,这样在上面的场景中,无论在访问我的网站后他们在“记住”时首先点击什么页面,会话对象都不会为空.这样做的好地方在哪里?在应用程序启动?在SessionUtil中(现在它只是会话变量的静态包装器)?控制器上的基类?我该怎么做?我已经编写了逻辑来让用户关闭用户名. 编辑:好吧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始终为null.但我没有得到的是默认的_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,它将在新会话的第一个请求时运行:
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; } } 最终结果是,您无法请求会话实用程序的User属性为null. 编辑:为了清楚,会话与被“记住”无关.您的站点知道您已登录并进行身份验证,因为您拥有ASP.NET授权cookie.这与Session无关. Session只是一个范围内存存储器,可供每个唯一用户使用,是否经过身份验证. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – precompiledApp.config的目的是什么?
- asp.net-mvc – JQGrid和MVC完整工作示例
- asp.net-mvc-2 – 在Visual Studio 2010 RC中更改默认浏览器
- 在ASP.NET MVC中如何应用多个相同类型的ValidationAttribut
- entity-framework – 未找到Entity Framework数据提供者,en
- asp.net – 如何从JavaScript访问ASPxTextBox的值
- asp.net-mvc – 用于MVC网格的Kendo UI如何隐藏ID列
- asp.net-mvc – 如何将数据属性放在Ajax.BeginForm中?
- asp.net – 将web.web应用程序池添加到web.config会导致500
- asp.net-mvc-3 – 是否有可能将太多的存储库注入控制器?
- asp.net-mvc – 如何在MVC 5A应用程序中实现OWIN
- asp.net – Visual Studio IIS Express不工作
- asp.net-mvc – 在同一页面上创建新的父项和子节
- asp.net-mvc – Ajax.Actionlink在新页面中打开
- asp.net – 找出.NET创建的HTML元素的客户端ID?
- asp.net – SQL Server用户定义的表类型和.NET
- 如何在两个不同的文件夹中应用asp.net授权?
- asp.net-mvc – 哪个更适合为我的网站构建API:M
- asp.net-mvc – 我可以在Ajax.ActionLink中使用O
- Asp.net:System.Security.SecurityException