在 MVC 中(服务器)交互期间检查用户状态

Check status of user during (server) interaction in MVC

我的想法有点问题,我不确定我已经构建的东西是否可以更有效地完成,所以我将在这里分享我的 'problem'。 (需要说明的是,我所做的一切都有效,我只是想让它更有效率)。

我有一个用 MVC 和 SQL 制作的网络应用程序,它有一个用户登录系统等。 用户有一个状态,它是一个枚举,可以是活跃的、被阻止的等,并存储在数据库中(与其他用户数据一起)。

在我的网络应用程序中,我创建了自定义 AuthorizeAttr。用于在每次调用时授权用户(作为全局过滤器应用)。

但是,'normal' 身份验证是基于 cookie 的,当我更改数据库中的用户状态时,cookie 不会改变。例如,用户可以停用同一组中的另一个用户(当是管理员时)。这些数据库更改不会立即生效,因为默认情况下授权仅验证 cookie,而 cookie 是基于登录时的状态。

为了解决这个问题,我在我的 authorizationAttr 中添加了一些额外的逻辑,它在每次请求时调用数据库以获取当前用户状态(枚举),然后简单地检查是否允许用户继续,或需要重定向。

在每个请求上调用数据库(即使只是 1 个枚举)似乎对 server/db 来说有点费力,尤其是当 webapp 越来越受欢迎(= 很多用户)时。

我想到的一个想法是将枚举缓存在会话缓存中,但在很短的时间内(比如 60 秒),这将节省一些数据库调用,但显然用户仍然可以在最多 60 秒后使用 webapp被停用。

当然,我认为这些数据库调用实际上很费力,这可能是错误的。

有什么改进的想法吗?

您是否考虑过使用 ADO.NET 数据集来满足您的要求?如果您没有多个前端,您可能最初将登录状态读入数据集中。可以对此进行所有 read/write 操作,您可以稍后将更改保存到实际数据库中。如果您有多个前端,是否可以将一个组的所有 read/write/modify 操作限制为单个前端实例?因为我猜你也可以在这种情况下使用数据集方法。

您怎么知道检查每个请求的状态太昂贵了?您是否测量了检查数据库中用户状态的性能成本?您是否在没有实际衡量简单解决方案的成本的情况下创建了自定义缓存?你像hibernate一样使用ORM吗?他们内置了二级缓存,因此通常不会往返于数据库。

我认为坚持 KISS 原则比为 difficult problem 创建自定义解决方案更好。即使您的数据库将成为瓶颈,通常购买一次额外的硬件也比维护过于复杂的解决方案多年便宜

如果您的应用程序增长,您首先要丢弃的是关系数据库