在Controller和Action上解析FilterAttributes

时间:2008-11-07 23:53:25

标签: asp.net-mvc

我想这样做:

[RequiresAuthentication(CompanyType.Client)]
public class FooController
{    
     public ActionResult OnlyClientUsersCanDoThis()

     public ActionResult OnlyClientUsersCanDoThisToo()

     [RequiresAuthentication]
     public ActionResult AnyTypeOfUserCanDoThis()

你可以看到为什么这不起作用。在第三个操作上,控制器级过滤器将阻止非客户端。我想改为“解决”冲突的过滤器。我希望更具体的过滤器(动作过滤器)始终获胜。这看似自然而直观。

曾几何时filterContext为执行操作公开了MethodInfo。那会让这很容易。我考虑使用路线信息自己做一些反思。这样做是行不通的,因为它可能会重载,我无法判断哪一个是当前正在执行的那个。

另一种方法是在控制器级别或操作级别对范围过滤器进行范围调整,但不会混合,这会产生大量额外的属性噪声。

3 个答案:

答案 0 :(得分:3)

我们正在研究一种揭露其他过滤器的方法,但没有承诺。

将过滤器应用于控制器实际上不是“范围”,它只是将其应用于所有过滤器的简写。不幸的是,这意味着你不能包括除一个动作之外的所有动作一种简单的方法是将一个方法放在另一个控制器中。您甚至可以为该案例添加自定义路由,以便不必更改URL。

答案 1 :(得分:0)

您可以将授权逻辑放入Controller的OnActionExecuting(..)方法,即

public override void OnActionExecuting(ActionExecutingContext filterContext) {
    base.OnActionExecuting(filterContext);
    new RequiresAuthentication()
    { /* initialization */ }.OnActionExecuting(filterContext);
}

希望这有帮助,

托马斯

答案 2 :(得分:0)

您可以使用控制器上的常规身份验证过滤器以及操作上的特定身份验证过滤器来更改过滤器顺序。不知怎的,这样:

[RequiresAuthentication]
public class FooController
{
  [RequiresAuthentication(CompanyType.Client)]
  public ActionResult OnlyClientUsersCanDoThis()

  [RequiresAuthentication(CompanyType.Client)]
  public ActionResult OnlyClientUsersCanDoThisToo()

  public ActionResult AnyTypeOfUserCanDoThis()