13

Estoy construyendo un CMS simple en el que los roles se configuran dinámicamente en el panel de administración. La forma existente de autorizar un método de controlador, agregando [Authorize(Roles="admin")] por ejemplo, ya no es suficiente. La relación de rol y acción debe almacenarse en la base de datos, de modo que los usuarios finales puedan otorgar/recibir permisos hacia/desde otros en el panel de administración. ¿Cómo puedo implementar esto?ASP.NET MVC - Autorización dinámica

Respuesta

0

Eso es exactamente lo que hace el material de membresía/perfil de ASP.NET por usted. Y funciona con el atributo Autorizar.

Si desea enrollar el suyo, podría crear un filtro de acción personalizado que imite el comportamiento del filtro de acción Authorize estándar. Pseudo código a continuación.

public MyAuthorizeAttribute : ActionFilterAttribute 
{ 
    public string MyRole { get; set; } 

    public void OnActionExecuting(ControllerContext context) 
    { 
     if (!(bool)Session["userIsAuthenticated"]) 
     { 
      throw new AuthenticationException("Must log in."); 
     } 

     if (!Session["userRoles"].Contains(MyRole)) 
     { 
      throw new AuthenticationException("Must have role " + MyRole); 
     } 
    } 
} 
+0

Soy bastante nuevo en esas cosas, pero vi un ejemplo en el que el rol se asignó específicamente en el código, y NO LO quiero. por ejemplo, algunos clientes pueden tener un grupo de usuarios llamado "Ingeniero" que tiene privilegios específicos. Quiero que pueda configurarlos desde el panel de administración, sin tocar ningún código. En este momento, no puedo ver cómo se puede usar el atributo Autorizar estándar para ese – xantrus

+0

Gracias, lo comprobaré – xantrus

+0

Bueno, entonces tendría que agregar búsquedas en su base de datos en algún momento, tal vez coincidir con el usuario y el controlador/nombres de acción con una regla de acceso que tiene en el DB. O algo así. – rmac

0

El papel - relación de acción debe ser almacena en la base de datos

Usted tendrá que comprobar su seguridad dentro del método de controlador, a menos que desee subclase AuthorizeAttribute de modo que mira hacia arriba los roles de la base de datos para usted.

18

Si desea tomar el control del proceso de autorización, debe crear la subclase AuthorizeAttribute y anular el método AuthorizeCore. Luego simplemente decore sus controladores con su CmsAuthorizeAttribute en lugar del predeterminado.

public class CmsAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override virtual bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     IPrincipal user = httpContext.User; 
     IIdentity identity = user.Identity; 

     if (!identity.IsAuthenticated) { 
      return false; 
     } 

     bool isAuthorized = true; 
     // TODO: perform custom authorization against the CMS 


     return isAuthorized; 
    } 
} 

La desventaja de esto es que usted no tendrá acceso a la COI ctor-inyectada, por lo que tendrá que solicitar cualquier dependencia del contenedor directamente.

+0

¿cuál es la desventaja de obtener dependencias del contenedor directamente? Tuve que hacer esto para mi implementación de RoleProvider ... – Haroon

+1

@Haroon - La desventaja es una de diseño. En general, se considera que es mejor práctica que el código permanezca ignorante del contenedor IoC para reducir sus dependencias (por ejemplo, es posible que desee reutilizar su código en WP7, donde generalmente se evita un contenedor basado en reflexión por motivos de rendimiento). –

+0

@Haroon - Dicho esto, MVC 3 admite la inyección de atributos de filtro a través de propiedades decoradas por atributos. Todavía es necesario conocer el contenedor, pero se burla más fácilmente. –

Cuestiones relacionadas