【问题标题】:Storing user data in session store or retrieving from database in each request in asp.net core?在asp.net核心的每个请求中将用户数据存储在会话存储中还是从数据库中检索?
【发布时间】:2025-12-27 16:15:05
【问题描述】:

我正在将旧的 ASP.NET Web 窗体项目迁移到 ASP.NET Core Web API 和前端 Angular。在我的旧应用程序中存储用户信息实例及其值(如分配的组、权限和其他用户信息)。我将使用 JWT 我无法将所有信息存储在 JWT 中,所以我应该在我的 asp.net 中继续会话核心应用程序或在每个请求中从数据库中检索此信息?

现代应用程序开发中是否还有其他最佳实践?

【问题讨论】:

  • Session and State Management 文档已经解释了这一点。除非您有一个非常小的 Web 应用程序,否则无论如何您都将使用多个服务器,因此您必须使用由数据库支持的 distributed session storage
  • @PanagiotisKanavos 感谢您的评论。我已阅读文档。我有将近 5000 个用户我将使用 JWT 进行身份验证,但是在当前系统中,我在会话中存储权限和其他用户相关信息我应该删除会话并在每个增加数据库调用的请求中从数据库中检索此信息
  • 另一方面,roles 不是会话状态,它们是authorization properties。它们的存储由授权中间件处理,而不是会话管理。如果您使用声明身份验证,则只有声明应该进入 JWT,而不是整个用户配置文件

标签: c# asp.net asp.net-core asp.net-core-webapi asp.net5


【解决方案1】:

根据您的需要,有多种选择:

  1. 角度缓存。如果数据不敏感,可以使用rxjs observables在应用端缓存一些数据。存储在浏览器上的一些数据没有问题。由于您来自完整的回发应用程序,因此 SPA 缓存在大多数情况下等同于旧的 Session 对象。
  2. 根据实施情况,您可能还需要在服务器端进行一些缓存。由于如上所述您将拥有多个服务器,因此我建议仅缓存查找等,而不是与用户相关的数据。如果您使用服务器和会话实现粘性(不推荐),这仍然是一个选项。
  3. 分布式缓存。你可能听说过 Redis 之类的?这也是一种将缓存数据存储到第三个服务的选项,所有服务器实例都可以访问。

这一切都归结为复杂性与速度。如果查询足够简单且速度极快,那么将它们存储在任何缓存中都可能毫无用处。

【讨论】:

  • 感谢您的回答。我没有选择分布式缓存。我想限制 Web API 端点。我应该在会话中存储分配权限的数量(而且我还有其他信息)?或从数据库中检索每个请求哪个更可行