在asp.net中存储用户登录信息的位置

时间:2009-11-28 14:33:15

标签: asp.net session membership

当我构建需要用户登录的asp.net应用程序时,我在我的businees类中编写了一个方法,如果用户登录则返回一个Member对象实例,否则返回null。然后我这样做:

Session["User"] = user;

然后在每个页面加载中我必须实现这个:

User user = Session["User"] as User;
if(null==user){
 //toggle the state of ascx, to show username/password boxes again,
 //Response.Redirect("somewhere else") etc...
}

这看起来很有效,但这是一个好方法吗? 因为有时会话不再返回该对象。它发生在20分钟之前,这是会话的默认超时。那有什么共鸣吗?当我在测试期间进行多次回发时,它会随机发生。

提前致谢。

4 个答案:

答案 0 :(得分:3)

您无法使用Viewstate - 它的范围是当前页面。 你为什么不使用表单身份验证?它为您完成所有这些工作,包括在数据库中保留用户帐户。

答案 1 :(得分:3)

您应该毫无疑问地使用表单身份验证。以下是一些感兴趣的链接:

答案 2 :(得分:2)

根据我的经验存储用户信息的最佳方法是在数据库中。微软通过SqlMembershipProvider轻松实现这一目标。它为您提供了一个预定义的模式,其中包含最佳实践,例如存储密码哈希值和盐(NOT IN CLEARTEXT!)。这是一个良好的开端,可以自定义。干杯!

答案 3 :(得分:0)

如果您正在使用默认的InProc会话状态,它只存储在RAM中,因此它不仅可以在会话超时时消失,而且可以在AppPool回收时消失,这可能由于多种原因而发生(空闲超时,每天一次,过度使用内存等)。此外,每个页面都会锁定会话状态,因此,如果您的应用尝试同时进行多次访问,则可能会遇到问题。

您的用户对象有多大?如果它不是太大,您可以考虑将数据存储在cookie中,而不是存储在会话状态中。 Silverlight隔离存储是另一种选择。否则,您可以将其保留为DB并执行自己的缓存管理。这可能比使用Session字典更有效....

我应该补充一点,如果你可以使用内置的会员提供商,它确实简化了一些这样的东西,但我假设你有理由不去那条路 - 它绝对不是一个单一的 - 适合所有类型的解决方案。

相关问题