授权访问资源时查询数据库有哪些副作用?

时间:2016-09-08 12:31:16

标签: .net asp.net-mvc performance security asp.net-web-api

声明 问题是概念性的,然后是面向技术的,但为了清楚起见,我们正在开发基于 .NET MVC WebApi 系统的 Angular 应用。

我们目前正在使用我们自己的AuthorizeAttribute实现授权逻辑。

权限存储在数据库中,因为它们是动态的,而不是面向角色的。 使用当前设计,每次用户想要访问安全页面/ API时,我们都会查询数据库。

我的猜测是性能明智,一旦用户登录就获得所有权限,并从内存中读取它们会更好。 但是,如果有人在用户工作时更改了用户权限,则不会反映新的权限。

这里的最佳做法是什么? 每次请求“只是”访问数据库以检查权限? 我缺少的任何其他副作用或考虑因素?

2 个答案:

答案 0 :(得分:0)

缓存权限风险的一个缓解可能是强制注销功能 - 当管理员更改用户的权限时,他可以终止该用户的会话(或者如果任何权限被撤销,它可以自动终止)。当然,取决于应用程序的使用方式和使用者,这可能是也可能不是一个很好的缓解措施。

此外,由于内存在这种情况下是技术上的缓存,您可以实现某种缓存失效逻辑,在最简单的情况下,您可以在内存中存储从数据库读取授权权限的时间戳以及在设定的时间之后重读它们。显然,这会使一些不幸的请求比其他请求慢,在您的情况下再次可能会或可能不会接受(并且许可的剩余风险不会立即生效)。

您还可以选择使用某种缓存解决方案实现完整的缓存,但由于您必须关心缓存权限的完整性等,因此它会变得更加困难。

答案 1 :(得分:0)

我认为最佳做法是主观的,所以我甚至不去那里。虽然在我看来,从数据库中预先获得尽可能多的数据是最佳的。

由于权限可以在用户登录时更改,因此您可以预先缓存其所有权限,并使用SqlCacheDependency使缓存与数据库中的权限保持同步。