我的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
感谢您的回答!
答案 0 :(得分:7)
是的,它是安全的,因为会话存储在服务器上。但是如果您决定使用ASP.NET会话,那么您应该考虑另一个问题。如果此会话存储在Web服务器的内存中(默认),则IIS可以随时回收您的应用程序,并且您将丢失此会话数据。另一方面,用户仍将被认证,因为他将被仍将被发送的表单认证cookie跟踪。因此,如果您想使用Sessions,我建议您切换到进程外会话提供程序(例如StateServer
或SQLServer
)。
同样正如@Mikeb在评论部分指出的那样,会话还有另一个非常严重的问题。如果为给定控制器启用了读写模式,则无法并行处理来自同一会话的多个请求。服务器将按顺序阻止和处理它们。例如,考虑来自同一会话的多个AJAX请求。它们都将按顺序阻塞和处理。