asp.net cookie,身份验证和会话超时
我有一个asp.net网站使用表单认证。我在会话中保留了一些用户名,用户ID,电子邮件等。
我允许用户通过在身份验证Cookie上设置较长的到期日期来保持登录网站。因此,在用户仍然通过身份验证时,会话过期是非常常见的。 我遇到的问题是,有时用户的会话超时,但他们仍然进行身份验证。因此,例如,我的一个用户页面(需要身份验证)会在他们的会话处于活动状态时说“欢迎麦克”,但一旦到期,它会说“欢迎[空白]”,因为该信息不再在会话中,仍然被认证。 什么是最好的办法来处理这个?当信息不再存在时,我应该重新同步会话信息吗?或者我应该将用户信息(用户名,用户ID,电子邮件)移动到cookies,不担心会话超时? 我不想将会话长度设置为60分钟或更长时间。我想要的是我的用户能够登录一次,而不必担心必须重新登录,直到他们显式注销。 解决方法
避免使用会话尽可能多,如果你可以逃避没有看到它使多服务器部署qutie有点更容易。很可能,姓名和电子邮件是cookie的容易候选人。很容易伪造一个cookie,所以userID可能不是一个好主意,这取决于你的安全需要。
表单验证Cookie已加密,您可以向这些Cookie添加额外数据(请参阅下面的详细信息)。它可能是黑客,但不像一个简单的cookie那么容易。 这里是我以前用过的代码稍作修改去删除一些项目的具体细节。在登录控件的LoggedIn事件中调用此函数。 void AddUserIDToAuthCookie(string userID) { //There is no way to directly set the userdata portion of a FormAuthenticationTicket //without re-writing the login portion of the Login control // //I find it easier to pull the cookie that the Login control inserted out //and create a new cookie with the userdata set HttpCookie authCookie = Response.Cookies[AUTH_COOKIE]; if(authCookie == null) { return; } Response.Cookies.Remove(AUTH_COOKIE); FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value); var newTicket = new FormsAuthenticationTicket(oldTicket.Version,oldTicket.Name,oldTicket.IssueDate,oldTicket.Expiration,oldTicket.IsPersistent,userID,oldTicket.CookiePath); authCookie.Value = FormsAuthentication.Encrypt(newTicket); Response.Cookies.Add(authCookie); } FYI,我从一个旧项目复制,并在这里编辑它删除一些项目特定的位,所以它可能无法编译,但它会非常接近。 要在您的网页中获取ID … FormsAuthenticationTicket ticket = ((FormsIdentity) Page.User.Identity).Ticket; string id = ticket.UserData; 我使用这种机制来存储不是aspnetdb用户数据的一部分的id。如果所有的身份数据都由aspnetdb处理,您可能只需要访问Page.User.Identity对象。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – MVC @ Html.Display()
- asp.net-mvc – 窗口身份验证在MVC4中不起作用
- asp.net-mvc – 返回json中的双引号
- 基于ASP.Net Core开发的一套通用后台框架
- ASP.NET Response.Cache.SetNoStore()与Response.Cache.Set
- asp.net – 无法从代码隐藏中调用App_Code类
- asp.net – System.Reflection.Assembly.LoadFile锁定文件
- asp.net – 实体框架如何决定是引用现有对象还是创建新对象
- ASP.NET - 将 ASP.NET 用作高性能文件下载器
- 详解ASP.NET Core 中的框架级依赖注入