2011-10-03 6 views
1

J'ai un ActionFilter qui est appliqué à mon contrôleur de base qui vérifie certaines choses dans la requête et la session et s'assure que vous êtes autorisé à voir l'URI demandé.Interdire toutes les pages sauf des pages spécifiques avec ActionFilter

Cela a fonctionné très bien jusqu'à présent lorsque nous avons besoin d'interdire toutes les pages (comme il existe aujourd'hui), mais permettre quelques URIs ici et là. Idéalement, j'appliquerais un attribut à ceux que nous voulons autoriser, puis je vérifierais cet attribut dans le filtre et j'autoriserais s'il existe, mais je n'arrive pas à comprendre comment faire cela dans le filtre.

Des idées ou des suggestions?

+0

avez-vous essayé d'ajouter un paramètre sur votre filtre et essayez d'ignorer en fonction de ce paramètre? disons [CustomAttribute ("IgnoreThis")] –

Répondre

0

J'ai passé plus d'une heure à essayer de comprendre cela, puis j'ai posté ici sur SO. Quelques minutes plus tard, ça m'a frappé.

D'abord, je créé un attribut

public class AlwaysAllowAnonymousAttribute : Attribute {} 

Deuxièmement, je marque mon action ou un contrôleur avec l'attribut ci-dessus

Enfin, dans mon ActionFilter Je l'ai fait

public class VerifyResourceAccess : ActionFilterAttribute, IActionFilter 
{ 
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     var actionAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AlwaysAllowAnonymousAttribute), false); 
     var controllerAttributes = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(AlwaysAllowAnonymousAttribute), false); 
     bool alwaysAllow = (actionAttributes.Length > 0) || (controllerAttributes.Length > 0); 

     if (!alwaysAllow) { 
      /* ... Some logic for checking if this user is allowed to access this resource ... */ 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

Toute action ou Le contrôleur qui est marqué avec l'attribut aura toujours un accès autorisé.

Questions connexes