2011-02-23 14 views
5

He escrito un atributo de autorización personalizado derivado de System.Web.Mvc.AuthorizeAttribute. Lo estoy usando con éxito desde mis controladores para restringir el acceso a ciertas funciones.Cómo evitar la duplicación de la lógica del código de autorización

public class ArticleController : Controller 
{ 
    [CustomAuthorize(Role.Administrator)] 
    public ActionResult Delete(int id) 
    { 
     // ... 
    } 
} 

Y eso funciona bien. Ahora quiero mostrar u ocultar elementos HTML de acuerdo con la misma lógica de autorización. Por ejemplo, en mi opinión, "Artículo", quiero ocultar el botón de acción "Eliminar" si el usuario no es un administrador. He escrito algo así:

<ul id="menu"> 
    <li>@if (User.IsInRole(Role.Administrator)) { 
      @Html.ActionLink("Delete", "Delete", "Article", new { id = article.ID }, null) 
     } </li> 
</ul> 

Trabaja muy bien también, pero crea código de la lógica duplicación porque necesito para especificar el doble de credientials necesarios para realizar una acción:

  • En el controlador bloquear o permitir la acción.
  • En la vista para mostrar u ocultar el enlace de acción.

¿Cuál es la mejor forma de evitar esta duplicación? ¿Hay alguna forma de reutilizar mi atributo de autorización personalizado de las vistas?

Respuesta

3

Un ayudante personalizado debe ser la mejor opción, algo así como:

@Html.SecureActionLink("Delete", "Delete", "Article") 

Este ayudante comprobaría en algún tipo de servicio para ver si el usuario actual/función tiene permiso en este enlace.

1

Haga que el menú sea una vista parcial.

1

Crearía un helper html personalizado para esto.

public MvcHtmlString AuthorizedActionLink(this HtmlHelper htmlHelper, 
string actionName, ... , Role role) 

Y si se siente el parámetro Role es redundante, es posible inspeccionar la acción del controlador utilizando la reflexión y determinar los roles permitidos automáticamente.

Cuestiones relacionadas