MVC:在哪里放置权限检查逻辑?

时间:2011-03-31 01:25:45

标签: asp.net-mvc

我正在创建一种博客。有用户,社区,帖子,评论。 当用户即将阅读他朋友的帖子时,系统必须为每个帖子检查该用户的“READ”权限。评估该权限的逻辑可能很大(取决于社区和朋友的博客设置,关于frendship状态等),检查它的更好方法是获取帖子列表时的数据库存储过程:)) 但我使用经典的存储库/服务模式,并将我的业务逻辑放入服务层。我也存储了我的“CanRead”,“CanUpdate”等。 我担心在服务层过滤帖子会很贵... 想法?

3 个答案:

答案 0 :(得分:3)

在ASP.NET MVC中,评估用户权限的最合适的一点是在Controller操作上使用自定义AuthorizationFilter属性。

这是关于Implementing a Custom ASP.NET MVC Authorization Filter的文章。此示例使用基于角色的安全性,但没有什么可以阻止您使用任何其他授权逻辑系统。

答案 1 :(得分:1)

永远不要像@smartcaveman那样在[Authorize]属性中放置这些基于粒度任务的检查。

最终,基于粒度角色的权限需要某种链接修剪,即除非用户具有权限,否则不显示链接。通过将大量的细化权限检查放入authorize属性,MVC内部会磨掉伪造检查这些授权属性的请求。

所以会发生什么是10个属性= 10个检查,100 = 100个检查,1000 = 1000个检查PER页面。这真的很糟糕。

听起来你真正拥有的是基于用户的多租户。在这种情况下,将这些类型的查询直接放在数据库层中是正确的做法。没有什么说你不能使用Repository模式的存储过程。

答案 2 :(得分:0)

Jim,首先要指出的是尝试尽可能地保持业务逻辑在应用程序内部。这意味着将数据库纯粹视为数据存储。因此,您的域逻辑应保留在您的asp.net代码中。

关于您的问题,我建议您设计系统,以便在“阅读”时无需过滤,从而减慢交付速度。这意味着拥有一个索引,可以看到当数据被添加,更新和删除时,您自动维护的对象。

您可能会发现此解决方案耗时很长。但是,如果在查看时过滤数据是一项昂贵的操作,那么这项工作非常值得您花时间。