应用逻辑(认证/授权的适当位置)

时间:2010-12-14 16:44:26

标签: asp.net-mvc domain-driven-design logic asp.net-mvc-3

我正在使用MVC 3(RC2)开发类似CMS的应用程序,此时我正处于十字路口。如果我提出的方法是否合适,我无法说服自己。我想这是因为我知道我正试图削减一些角落,这将使我在以后的线路上花费很多。

我将直接描述我的问题:

1)我有一个资源(让我们称之为A),必须使其可编辑。

2)我有一个自定义权限系统,它有2个(很多)权限:

  • 可以编辑自己的资源
  • 可以编辑其他资源

3)如果资源A的创建者具有“可编辑自有资源”权限,则可以自由编辑它。

4)如果他们拥有“可以编辑其他资源”

的权限,则单独的用户只能编辑A.

现在描述了这个要求,让我告诉你我到目前为止的方法:

1)我有一个名为'ResourceController'的控制器

2)我有一个名为'编辑'的动作

3)该动作有一个属性:[CustomerAuthorize(Perm.CanEditOwnResource,Perm.CanEditOtherResource,Any = true)]

4)我有一个服务类负责域验证。

因此,如果用户拥有“可以编辑自己的资源”或“可以编辑其他资源”权限,则可以调用操作方法。

我如何决定(以及在何处做出此决定)关于用户是否拥有正确的权限(取决于他们是否拥有资源?)是否应该在控制器操作中,在资源服务类中,在一个单独的服务类?

等待听到不同意见......

2 个答案:

答案 0 :(得分:2)

由于MVC的性质,您需要在各个点进行身份验证检查。

首先,您需要能够在UI上显示视觉提示(即显示编辑按钮或不显示它),因此逻辑必须可供您的视图使用。

当然,这只是出于用户界面的目的。您还需要对控制器操作进行身份验证/授权,以防万一有人绕过您的UI来访问它。

最后,在执行操作之前,最安全的地方是对操作进行身份验证和授权。例如,如果你有一个处理程序,我会在那里放置一些授权逻辑。您希望确保没有人可以通过从其他地方调用服务来编写您的安全逻辑,并且不知道该服务存在限制。这有助于使安全选项更加精细。

答案 1 :(得分:0)

接近它的一种方法是有2个动作,而只有“编辑”,你有“EditOwnResource”和“EditOtherResource”。然后,您可以对其中的每一个放置一个权限。

然后,如果您正在使用MVVM模式,则可以绑定这些操作的可用性,以便它是ownResource或otherResource。这些值的设置在视图模型中完成。