2009-09-04 23 views
6

El filtro AUTORISO permite al grupo especificado de usuarios que pueden acceder a un controlador o acción:ASP.NET MVC: Frente de [Autorizar]

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

me gustaría saber si es posible, en vez , especifique un grupo de usuarios que no pueden acceder a un controlador o acción.

+1

No puedo imaginar un escenario donde la desconexión desde una implementación de lista blanca hasta una implementación de lista negra tendría sentido. –

+0

No quiero que mis administradores accedan a los controladores relacionados con el cliente, pero obviamente necesito que los usuarios no autorizados y los clientes puedan hacerlo. – ajbeaven

+0

Hay muchos casos en los que tiene sentido, y la mayoría de los sistemas de autorización incluyen soporte para denegación. Considere un escenario donde todos los usuarios tienen permiso para hacer algo, excepto para los miembros de un rol específico. – ShadowChaser

Respuesta

5

He intentado crear mi propia AuthorizationAttribute después de la sugerencia 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; 
    } 
} 

y lo uso como esto:

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

estoy seguro de si es una práctica correcta, pero cumple su función.

+0

me parece bien! :) – jeef3

+0

¿Su atributo Restringir acepta más de un rol a la vez? – twk

+0

+1 Buena solución simple – CmdrTallen

1

Debe preparar su propio ActionFilter que pueda implementar dicha función. Por defecto hay una regla de denegar todo, pero permitida por el filtro Autorizar acción (como ya sabe).

poco de inspiración se puede encontrar there

1

Basado en ajbeaven's answer, logré extenderlo a la lista de funciones en lugar de una función.

En primer lugar el Restringir clase:

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; 
    } 
} 

A continuación, añadir la clase AppRoles para que todo el reutilizable solución:

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

Uso:

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