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

时间:2015-01-19 13:49:54

标签: c# asp.net-mvc security database-performance authorize-attribute

我有点思考问题,我不确定我已经构建的内容是否可以更有效地完成,这就是为什么我要分享我的'问题'这里。 (很明显,我所建造的一切都是有效的,我只是希望提高效率)。

我有一个用MVC制作的webapp& SQL为用户提供登录系统等。 用户具有状态,即枚举,可以是活动的,阻止的等,并存储在数据库中(以及其他用户数据)。

在我的webapp中,我制作了一个自定义的AuthorizeAttr。用于在每次调用时授权用户(应用为全局过滤器)。

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

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

在每个请求上调用数据库似乎(即使只是1个枚举)似乎对服务器/数据库有点麻烦,特别是当webapp越来越受欢迎时(=很多用户)。

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

我认为这些数据库调用实际上当然是一种征税是错误的。

有任何改进的想法吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你怎么知道每个请求的检查状态太贵了?您是否测量了在数据库中检查用户状态的性能成本?您是否创建了自定义缓存而无需实际测量简单解决方案的成本?你喜欢使用像hibernate这样的ORM吗?它们内置了二级缓存,因此通常不会向数据库进行往返。

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

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