ASP.NET MVC - 存储用户ID的最佳位置 - 整数?

14

我感觉在ASP.NET MVC中使用会话变量有点被贬低了。

用户一旦登录,我希望保留用户的userId,以便不必一次又一次地查询它等等。

在ASP.NET MVC中,最有效的方法是什么?

4个回答

19

我时不时地看到类似的问题,但我想不通这种“感觉”是从哪里来的。Session 是专门设计用于存储与会话相关信息的。使用 Session 存储用户 ID 或类似信息完全没有任何问题。


2
人们错误地将Session用作身份验证,这正是progtick正在做的事情所带来的氛围。 - John Farrell
1
我认为Membership/Profile提供程序会为您处理所有这些问题,而且微软也鼓励使用它。他们甚至在示例应用程序中包含了一个示例。 - Raúl Roa

8
你的感觉是正确的。然而,在很多情况下,它并不是必要的。Session状态很容易丢失,并且经常被误用于处理已登录的用户(通过设置Session ["IsLoggedIn"] = true或检查Session ["User"]!= null来设置用户已登录,突然Session消失并注销用户),应使用表单身份验证。在这里,您可以阅读有关表单身份验证及其存储附加数据的更多信息: 表单身份验证配置和高级主题 如果您仍然想使用会话,则最好创建包装器以使其更易于测试并摆脱代码中的字符串: ASP.NET Session的包装器

你不想使用表单身份验证,然后将用户名等信息存储在会话中吗? - Joe Phillips
1
@d03boy:默认情况下,用户名存储在表单身份验证 cookie 中。您可以添加用户的 ID。如果您丢失会话(这在许多情况下都可能发生,例如当某人更改 web.config 时),则您的数据将处于安全位置,无需重建它。好吧,您可以使用会话,但请记住,当用户登录时,会话可能会丢失。 - LukLed

2
会话(Sessions)旨在用于有状态的用户交互 - 比如购物车。它们备受鄙视,因为测试起来很痛苦,而且往往会强制将序列化逻辑放入控制器中。如果您只想最小化查询,请使用缓存。

编辑: HttpContext.Cache 的教程非常难找到。Steven Sanderson 在 Pro ASP.net MVC Framework(Apress 2009)第530-534页中有大约4页的介绍。

Caching in asp.net-mvc 也可能给您一些提示。


你能否发布一个关于ASP.NET MVC缓存的链接? - TPR

0

会话状态。不合适时不应使用它。但没有其他东西可以完全替代凭据。只需确保它们是可序列化的,这样在需要时就可以将会话推出进程。


1
但是没有其他东西可以像凭据一样工作。比如cookies和FormsAuthentication?Cookies比Session稳定性高1000%。 - John Farrell
为什么你不能只检查一下会话,并在会话不可用时让用户重新登录呢?我不太明白为什么 Cookie 更好。 - Joe Phillips
我并不是在争辩——我真的很想多听听关于这个的意见。 - Joe Phillips
登录通常是一个数据密集型的过程。您不仅需要加载用户,还需要加载他们的授权数据。在某些情况下,这些数据来自外部系统(AD/LDAP/Web Svc)。这不是您想要在每个页面请求中加载的数据类型。而且所有这些都假定使用了 cookie。但您可能也不希望该数据在每个请求中往返传输。因此,我更喜欢只将键放入 cookie 中。 - BnWasteland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接