Различать пользовательскую авторизацию на контроллере и действие

Я создал собственный атрибут Authorize, который наследуется от AuthorizeAttribute. Частью настройки является регистрация доступа пользователя к базе данных.

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

Я хочу иметь возможность использовать это на уровне контроллера, а также более детальный контроль для определенных действий, таких как в следующем примере:

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

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

}

Однако это приведет к тому, что пользовательский Авторизация будет регистрировать это дважды. Я искал ответ здесь /questions/43728799/aspnet-mvc4-avtorizatsiya-kak-na-kontrollere-tak-i-na-dejstvii/43728808#43728808 который привел бы меня к использованию атрибута переопределения, но я бы предпочел не создавать другой атрибут для отслеживания. Есть ли способ определить, на каком уровне он вызывается, или определить, есть ли дополнительные атрибуты для проверки? Только после завершения цепочки авторизации доступ должен быть зарегистрирован. Или есть лучшее решение для этого?

1 ответ

Решение

Основываясь на ответе NightOwl888 ( /questions/30285424/rasshirenie-atributa-authorize/30285437#30285437), я использовал атрибут "AllowMultiple = false" в своем пользовательском атрибуте. Это позволяет атрибуту действия переопределять атрибут контроллера.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class Authorization : AuthorizeAttribute
{ 
  ...
  dbRepo.LogAccessEntry(parameters);
  ...
}
Другие вопросы по тегам