使用MVC项目,用户在登录表单中插入其凭据。我通过网络服务获得有关该用户的所有其他信息,目前我正在这样存储:
var result = client.getUser(gui);
name = result.users.ElementAt(1).name;
...
...
Session["userCode"] = userCode;
Session["password"] = password;
Session["userName"] = name;
Session["userEmail"] = email;
Session["creationDate"] = creationDate;
Session["phoneNumber"] = phone;
在整个应用程序中,只要我需要,我就可以访问这些变量,如果我需要其中的数据。由于我正在开发一个只有大约5页的新项目,我想知道即使项目有几十页,或者我根本不应该使用会话变量,我是否会像这样访问它们。
是否有更好的方法来存储此记录的用户数据?
答案 0 :(得分:4)
首先要做的事情:不要在会话中存储用户密码 - 可怕的安全问题!
如果您刚刚构建应用程序,我强烈建议您使用Identity framework。在那里,您可以将声明添加到用户身份。声明列表就像是字符串到字符串的字典。你可以随时查询索赔。
因此,您可以轻松地向用户添加电话号码,电子邮件和创建日期,然后使用扩展方法获取此数据:
public static bool GetEmail(this ClaimsPrincipal principal)
{
if (principal == null)
{
return false;
}
var emailClaim = principal.Claims.SingleOrDefault(c => c.Type == "Email");
if (emailClaim == null)
{
return String.Empty;
}
return emailClaim .Value;
}
然后像这样调用这个方法:
ClaimsPrincipal.Current.GetEmail()
声明跟随用户加密的Cookie。
UPD :您不应该在会话中存储密码,因为您在身份验证后不需要密码。验证用户并设置auth cookie后,应从内存中删除密码。如果在身份验证后将其保留在会话中,则会出现会话数据暴露的情况,我可以想到的一个场景是异常堆栈跟踪被转储到ELMAH中,而ELMAH以纯文本形式公开会话变量。另一种情况是使用Glimpse - 它显示会话数据。
至于身份的社交方面 - 您可以安全地忽略所有这些并仅使用内部用户列表构建您的应用程序。我刚刚将其中一个项目从MembershipProvider迁移到Identity,并且没有对社交身份验证进行任何依赖。
对于VS2010(为什么不升级?),Identity仅依赖于Entity Framework 6.1,但不依赖于MVC或其他任何东西,因此除非您使用的是Database First EF,否则应该没有问题。那种情况下EF6.1工具可能不适用于VS2010。但是,我还没有在VS2010中尝试这个,我建议你在VS2010中创建一个小型测试项目,模拟与你网站的身份集成。