4

我的 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每次我需要它时创建它,我想将它保存在登录方法的会话中。

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 自定义用户信息,因此您不必每次都重新计算它。

使用自定义主体对象视频教程

谢谢你的回答!

4

1 回答 1

7

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

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

于 2013-02-08T13:27:27.157 回答