2011-05-13 42 views
7

Yo escribo una aplicación ASP.NET MVC 3 y que tiene una serie de funciones:ASP.NET MVC 3 personalizada Autorización

Sistema de administración, administración de atención al cliente, propietario de Presupuesto, App propietario

Sé que Puedo restringir fácilmente el acceso a ciertos controladores (y métodos de acción) usando el atributo [Autorizar (Roles = "...")].

Sin embargo, parte de la autorización no se basa únicamente en la función, sino en los permisos. Por ejemplo, los propietarios del presupuesto solo deberían poder acceder a los presupuestos asignados a su centro de costos, no a los presupuestos de otras personas.

En la actualidad tengo algo de código dentro de los métodos de acción para comprobar esto:

if(UserCapabilities.CanAccessBudget(budgetId)) 
{ 
    // get budget and show view 
} 
else 
{ 
    // redirect to index action 
} 

Esto está empezando a hacer mi código desordenado y hacer la comprobación de seguridad en una pesadilla - ya que tengo muchos métodos de acción que necesitan estos diferentes tipos de verificaciones de autorización.

Una idea que he tenido es escribir algunos atributos a medida que puedo usar para decorar mis métodos de acción y limpiar mi código:

// 
// GET: /Budgets/View/1 
[CanAccessBudget] 
public ActionResult View(int id) 
{ 
//... 
} 

¿Qué piensa la gente? ¿Escribir los atributos personalizados es la manera más limpia y sostenible de llevar?

Respuesta

15

Se podría escribir un atributo de autorización personalizado:

public class CanAccessBudgetAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (isAuthorized) 
     { 
      var request = httpContext.Request; 
      var budgetId = request.RequestContext.RouteData.Values["budgetId"] 
       ?? request["budgetId"]; 
      var currentUser = httpContext.User.Identity.Name; 
      return HasPermissionsForBudget(currentUser, budgetId); 
     } 
     return isAuthorized; 
    } 
} 

y luego:

[CanAccessBudget] 
public ActionResult View(int id) 
{ 
    //... 
} 
+0

dang ... me ganaste: -/Deje de intentar responder a cualquier pregunta de .NET cuando estás en línea Darin, eheheh: P muy buen enfoque, aunque :) lo usará en mi proyecto a medida que avanzamos ! – balexandre

+0

¡Muy bien! Con la adición de un constructor para pasar el nombre del parámetro "budgetId", será perfecto. – gw0

0

Sería mejor poner el autorizar/redirigir la lógica en un ActionFilterAttribute, debido a que busca permisos (que se basan en parámetros de acción, no solo en los roles que ocupa el usuario).

Aunque la refacturación de la lógica en un atributo que solo se usa una vez puede volverse desordenada (con una tonelada de atributos).