2009-09-04 4 views
6

Le filtre authorize vous permet de groupe spécifié d'utilisateurs qui peuvent accéder à un contrôleur ou une action:ASP.NET MVC: En face de [Authorize]

[Authorize(Roles="Administrator")] 
public class HomeController : Controller 
{ 
    // code 
} 

Je voudrais savoir s'il est possible, au lieu , spécifiez un groupe d'utilisateurs que ne peut pas accéder à un contrôleur ou une action.

+1

Je ne peux pas imaginer un scénario dans lequel la commutation d'une implémentation de liste blanche à une implémentation de liste noire aurait du sens. –

+0

Je ne veux pas que mes administrateurs accèdent aux contrôleurs liés aux clients, mais j'ai évidemment besoin d'utilisateurs non autorisés et de clients. – ajbeaven

+0

Il existe de nombreux cas où cela est logique et la plupart des systèmes d'autorisation incluent la prise en charge du refus. Considérez un scénario dans lequel tous les utilisateurs ont la permission de faire quelque chose à l'exception des membres d'un rôle spécifique. – ShadowChaser

Répondre

5

J'ai essayé de créer mon propre AuthorizationAttribute après la suggestion de TWK:

public class Restrict : AuthorizeAttribute 
{ 
    private readonly string _role; 

    public Restrict(string role) 
    { 
     _role = role; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     if (httpContext.User.IsInRole(_role)) 
      return false; 

     return true; 
    } 
} 

et je l'utilise comme ceci:

[Restrict("Administrator")] 
public class HomeController : Controller 
{ 
    // code 
} 

Je ne suis pas sûr que ce soit c'est une pratique correcte, mais cela fait l'affaire.

+0

me semble bien! :) – jeef3

+0

Est-ce que votre attribut Restrict accepte plus d'un rôle à la fois? – twk

+0

+1 Une belle solution simple – CmdrTallen

1

Vous devez préparer votre propre ActionFilter qui peut implémenter une telle fonctionnalité. Par défaut, il existe une règle de refus de tout, mais autorisée par le filtre Autoriser l'action (comme vous le savez déjà).

d'inspiration se trouve there

1

Basé sur ajbeaven's answer, j'ai réussi à l'étendre à la liste des rôles au lieu d'un rôle.

Tout d'abord la Restreint classe:

public class Restrict : AuthorizeAttribute { 
    private List<string> _roles; 
    public string Roles { 
     get { 
      string roles = ""; 
      if (_roles != null && _roles.Count > 0) { 
       int counter = 0; 
       foreach (string role in _roles) { 
        counter++; 
        if (counter == _roles.Count) { 
         roles = role; 
        } else { 
         roles += role + ","; 
        } 
       } 
      } 
      return roles; 
     } 
     set { 
      _roles = new List<string>(); 
      string[] roles = value.Split(','); 
      foreach (string role in roles) { 
       _roles.Add(role); 
      } 
     } 
    } 

    public Restrict() { 
     _roles = new List<string>(); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) { 
     bool result = true; 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 
     foreach (string role in _roles) { 
      if (httpContext.User.IsInRole(role)) { 
       result = false; 
       break; 
      } 
     } 
     return result; 
    } 
} 

Ensuite, ajoutez la classe AppRoles pour rendre le réutilisable ensemble de la solution:

public static class AppRoles { 
    public const string Role1 = "Role1"; 
    public const string Role2 = "Role2"; 
} 

Utilisation:

[Authorize] 
[Restrict(Roles = AppRoles.Role1 + "," + AppRoles.Role2)] 
    public ActionResult Index() { 
    return View(); 
} 
Questions connexes