ASP.NET MVC:Action中的授权 - 建议模式或者这是一种气味?

ano*_*ous 10 model-view-controller asp.net-mvc authorization design-patterns single-responsibility-principle

我有一个ASP.NET MVC应用程序使用控制器和操作上的授权属性.这一直运作良好,但出现了新的皱纹.

对象:装运

角色:航运,会计,一般用户

装运在工作流程中移动.在状态A中,它只能由Shipping进行编辑.在状态B中,它只能通过会计编辑.

我有一个ShipmentController和一个Edit Action.我可以使用Authorization属性将Edit操作限制为仅限于这两个角色,但这并不区分Shipment所处的状态.我需要在服务调用之前在操作内部执行一些授权以确定用户是否真的有权执行编辑操作.

所以我有两个问题:

1)在Action中获得授权的好方法.Controller Action调用服务,然后服务对Shipment对象进行适当的调用(更新数量,更新日期等).我确信我希望Shipment对象不受任何授权要求的影响.另一方面,如果我希望服务对象知道授权,我没有真正掌握.这有什么好的模式吗?

2)我的问题实际上是设计糟糕的症状吗?我应该有一个StateAShipmentController和StateBShipmentController而不是ShipmentController吗?我没有在Shipment对象中内置任何多态性(状态只是一个枚举),但也许我应该,也许控制器应该反映出来.

我想我会采用更一般的解决方案,而不是针对我的情况.我只想提供一个例子来说明这个问题.

谢谢!

Mat*_*nze 2

您的授权属性可以从操作参数或路线数据中获取 Shipment,然后做出决定。

对于第一点,有许多模式可以在域对象中实现丰富的行为。在双重分派中,将对服务抽象(接口)的引用传递给对象上的方法。然后它就可以做它的事情了。您还可以编写一个应用程序服务来接收发货并完成工作。

就第二点而言,不一定。您可能需要将“上下文货件”的概念抽象为一项服务,以找出您所在的货件上下文。但我会一直这样做,直到您再次需要它为止。