j'avais un même besoin de quelque chose comme ça et a constaté que, en créant un filtre d'autorisation (mise en œuvre/découlant de FilterAttribute, IAuthorizationFilter
) plutôt qu'un filtre d'action ordinaire (provenant de ActionFilterAttribute
), et la mise en Inherited=true
et AllowMultiple=false
sur l'attribut, qu'il ne courrait qu'une seule fois au bon endroit. Cela signifie que je suis capable de "cascader" mon filtre d'un contrôleur de base (la valeur par défaut à l'échelle du site), à un contrôleur dérivé (par exemple AdminController ou autre), ou encore à une méthode d'action individuelle .
Par exemple,
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, Inherited=true, AllowMultiple=false)]
public class MyCustomAttribute : FilterAttribute, IAuthorizationFilter
{
private MyCustomMode _Mode;
public MyCustomAttribute(MyCustomMode mode)
{
_Mode = mode;
}
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
// run my own logic here.
// set the filterContext.Result to anything non-null (such as
// a RedirectResult?) to skip the action method's execution.
//
//
}
}
public enum MyCustomMode
{
Enforce,
Ignore
}
Et puis l'utiliser, je peux l'appliquer à mon super-contrôleur,
[MyCustomAttribute(Ignore)]
public class BaseController : Controller
{
}
Et je peux changer/remplacer pour les contrôleurs spécifiques, ou même pour des actions spécifiques!
[MyCustomAttribute(Enforce)]
public class AdministrationController : BaseController
{
public ActionResult Index()
{
}
[MyCustomAttribute(Ignore)]
public ActionResult SomeBasicPageSuchAsAHelpDocument()
{
}
}
Cela m'a permis de « éteindre » le filtre pour les cas spécifiques, tout en étant capable de l'appliquer par défaut sur le contrôleur soit tout ou ensemble de l'application.
Bonne chance!
pouvez-vous publier votre attribut? cela empêche-t-il l'action d'être frappée? – hunter
Je préfère ne pas publier l'attribut pour des raisons de données propriétaires, mais oui, il peut rediriger l'utilisateur vers la page de connexion plutôt que de permettre à l'action d'être touchée. –