Asp.net MVC在Session中保留敏感信息是否安全?

时间:2013-02-08 13:25:51

标签: asp.net asp.net-mvc session

我的Asp.net MVC网站上有一个基本的身份验证系统

[HttpPost]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
    WebSecurity.Login(model.UserName, model.Password, persistCookie: false)

    return RedirectToAction("Index", "Home");
}

我还有一个UserInfoViewModel课程,我保留了一些用户特定的信息,我在不同的页面上使用它。

为了避免每次需要时都创建UserInfoViewModel,我想将它保存在Session on Login方法中。

public ActionResult Login(LoginViewModel model, string returnUrl)
{
   WebSecurity.Login(model.UserName, model.Password, persistCookie: false)
   var userInfoViewModel = new UserInfoViewModel();
   Session["userInfo"] = userInfoViewModel;

    return RedirectToLocal(returnUrl);
}

考虑到我拥有UserInfoViewModel内部依赖的敏感信息,如IsSuperuser,将该对象保留在Session中是否安全?它会在用户登录会话到期时到期吗?

System.Security.Principal.IIdentity是为此做出的。它保存了您需要的AUTH cookie内部自定义用户信息,因此您不必每次都重新计算它。

Use Custom Principal Objects video turorial

感谢您的回答!

1 个答案:

答案 0 :(得分:7)

是的,它是安全的,因为会话存储在服务器上。但是如果您决定使用ASP.NET会话,那么您应该考虑另一个问题。如果此会话存储在Web服务器的内存中(默认),则IIS可以随时回收您的应用程序,并且您将丢失此会话数据。另一方面,用户仍将被认证,因为他将被仍将被发送的表单认证cookie跟踪。因此,如果您想使用Sessions,我建议您切换到进程外会话提供程序(例如StateServerSQLServer)。

同样正如@Mikeb在评论部分指出的那样,会话还有另一个非常严重的问题。如果为给定控制器启用了读写模式,则无法并行处理来自同一会话的多个请求。服务器将按顺序阻止和处理它们。例如,考虑来自同一会话的多个AJAX请求。它们都将按顺序阻塞和处理。