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对象。

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....