2016-03-18 1 views
0

Mon contrôleur utilise un attribut au niveau de la classe qui n'autorise qu'un seul rôle à accéder. Ce contrôleur a plus de 20 actions. Mais pour une seule action, j'ai besoin d'un rôle de plus pour avoir accès. J'ai déclaré le filtre d'attribut au niveau de la classe afin qu'il fonctionne correctement pour toutes les actions de la classe de contrôleur. Mais maintenant je veux remplacer celui-ci pour une seule action dans le même contrôleur. Y a-t-il une possibilité pour cela? J'utilise .Net version 4.5.comment remplacer un attribut de filtre personnalisé avec validation au niveau de l'action alors que la validation de niveau classe est déjà déclarée dans MVC

mise en œuvre d'attribut de filtre passe comme ceci:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
public class RequireModulePermissionAttribute : AuthorizeAttribute 
{ 
    //code goes here 
} 

classe contrôleur:

[RequireModulePermission("Admin")] 
public class AdministrationController : Controller 
{ 
    [HttpPost] 
    [RequireModulePermission("Admin","Supervisor")] 
    public ActionResult CreateUser(UserViewModel userVM) 
    { 
     //code goes here 
    } 
} 

Répondre

1

Jetez un oeil à cette réponse (regardez le cas 2) https://stackoverflow.com/a/16713334/2564920

Essentiellement, vous aurez besoin d'un deuxième attribut pour représenter le remplacement.

Alors attributs vous devenez:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
    public class RequireModulePermissionAttribute : AuthorizeAttribute 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      var action = filterContext.ActionDescriptor; 
      if (action.IsDefined(typeof(OverrideRequireModulePermissionAttribute), true)) return; 
      //code goes here 
     } 
    } 

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
    public class OverrideRequireModulePermissionAttribute : AuthorizeAttribute 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      base.OnAuthorization(filterContext); 
     } 
    } 

Le vous l'utiliser comme

[RequireModulePermission("Admin")] 
public class AdministrationController : Controller 
{ 
    [HttpPost] 
    [OverrideRequireModulePermission("Admin","Supervisor")] 
    public ActionResult CreateUser(UserViewModel userVM) 
    { 
     //code goes here 
    } 
}