【问题标题】:What are the side effects of querying the database when authorizing access to resources?授权访问资源时查询数据库的副作用是什么?
【发布时间】:2017-01-16 09:22:13
【问题描述】:

免责声明 这个问题是概念性的,而不是技术导向的,但为了清楚起见,我们正在开发一个基于 .NET MVCWebApi 系统的 Angular 应用程序。 p>

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

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

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

这里的最佳做法是什么? 访问每个请求的数据库“只是”检查权限? 我遗漏的任何其他副作用或注意事项?

【问题讨论】:

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


    【解决方案1】:

    我觉得最佳实践是主观的,所以我什至不会去那里。虽然在我看来,预先从数据库中获取尽可能多的数据是最佳选择。

    由于用户登录时权限可能会发生变化,因此您可以预先缓存他们的所有权限并使用SqlCacheDependency 使缓存与数据库中的权限保持同步。

    【讨论】:

      【解决方案2】:

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

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

      您也可以选择使用某种缓存解决方案来实现完整的缓存,但这变得越来越困难,因为您必须关心缓存权限的完整性等。

      【讨论】:

        猜你喜欢
        • 2018-10-11
        • 1970-01-01
        • 2020-01-31
        • 1970-01-01
        • 2021-09-11
        • 2020-01-20
        • 2017-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多