区分控制器上的自定义授权和操作

Differentiate between custom Authorize on controller and action

我创建了一个继承自 AuthorizeAttribute 的自定义授权属性。定制的一部分是将用户的访问记录到数据库中。

public class Authorization : AuthorizeAttribute
{ 
  ...
  dbRepo.LogAccessEntry(parameters);
  ...
}

我希望能够在控制器级别使用它以及对某些操作进行更精细的控制,例如以下示例:

[Authorization]
public class TestController : Controller
{
  public ActionResult Index()
  {
    ...
  }

  [Authorization (Roles="admin")
  public ActionResult SecureArea()
  {
    ...
  }

}

但是,这将导致自定义授权记录两次。我在这里 查看答案,这会引导我使用覆盖属性,但我不想创建另一个属性来跟踪。有没有办法区分它在哪个级别被调用或区分是否有其他属性要检查?只有当它完成授权链时,才应该记录访问。或者对此有更好的解决方案吗?

根据 NightOwl888 的回复 (),我最终在我的自定义属性上使用了 "AllowMultiple = false" 属性。这允许操作属性覆盖控制器属性。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class Authorization : AuthorizeAttribute
{ 
  ...
  dbRepo.LogAccessEntry(parameters);
  ...
}