在哪里存储用户登录信息?

时间:2012-01-19 07:35:44

标签: asp.net .net asp.net-mvc-3 security

我正在尝试创建一个ASP.NET MVC 3应用程序,其中我有自己的身份验证系统。我跟随了this site上写的一些内容,我在另一篇SO帖子中找到了这些内容。

在页面的大约一半时间内,作者编写了一个简短的会话管理器来保存用户登录信息。我显然也希望这样做,但作者暗示这不是一种好的做事方式,还有其他更好的方法。

这一切都很好,但有哪些更好的方法可以持续登录信息呢?

现在我将用户名,用户ID和登录状态保留到会话中,因为我需要经常提取用户特定信息,并且用户名很方便快速访问而不必重新访问在每个页面上查询数据库。

3 个答案:

答案 0 :(得分:4)

这取决于您的需求。

会话:

  • 保存在服务器上以消耗服务器资源
  • 最安全(没有人可以修改会话数据)
  • 在用户关闭浏览器时丢失

的Cookie:

  • 保存在客户端浏览器上(不消耗服务器资源)
  • 不太安全,因为它可以在客户端PC和网络上访问(因此加密cookie,特别是登录信息cookie是个好主意)
  • 你可以通过不同的会话来坚持

一般来说,当您遇到类似“不必在每个页面上重新查询数据库”的问题时,请问自己是否可以使用ASP.Net Caching

答案 1 :(得分:2)

我使用FormsAuthentication并创建一个附有用户序列化数据的票证。这几乎是一个cookie,但在.NET环境中得到了很好的支持。

由于您提到了“自己动手”的解决方案,这就是我在这些情况下使用的方法。

这会创建一个FormsAuthentication票证:

var authTicket = new System.Web.Security.FormsAuthenticationTicket(1, System.Web.Security.FormsAuthentication.FormsCookieName, DateTime.Now, DateTime.Now + System.Web.Security.FormsAuthentication.Timeout, false, this.Serialize(someObject));

var encrypt = System.Web.Security.FormsAuthentication.Encrypt(authTicket);

var authCookie = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName, encrypt) { HttpOnly = true };
HttpContext.Current.Response.Cookies.Add(authCookie);

这会抓取故障单信息:

var result = new FormsAuthenticationTicketData((HttpContext.Current.User.Identity as System.Web.Security.FormsIdentity).Ticket.UserData);

有几种方法可以将数据序列化到cookie中,但在将其放入cookie之前将其序列化为JSON(该对象必须能够序列化):

public string Serialize(object someObject)
{
    var serializer = new JavaScriptSerializer();
    var output = serializer.Serialize(someObject);

    return output;
}

要使用数据,您所要做的就是反序列化它。请记住,您真正希望传递此故障单的一些标识数据可用于从控制器或AuthorizeAttribute覆盖中提取“私有”信息。

希望有所帮助!

答案 2 :(得分:1)

我也为我的应用程序使用会话,它在所有场景中都能正常工作,所以不喜欢会话而不是cookie或缓存