ASP.NET MVC 4 Atributo de autorización personalizado con códigos de permiso (sin roles)

Necesito controlar el acceso a las vistas en función de los niveles de privilegio de los usuarios (no hay roles, solo niveles de privilegios para los niveles de operación CRUD asignados a los usuarios) en mi aplicación MVC 4.

Ejemplo como a continuación AuthorizeUser será mi atributo personalizado abd Necesito usarlo como a continuación.

[AuthorizeUser(AccessLevels="Read Invoice, Update Invoice")] public ActionResult UpdateInvoice(int invoiceId) { // some code... return View(); } [AuthorizeUser(AccessLevels="Create Invoice")] public ActionResult CreateNewInvoice() { // some code... return View(); } [AuthorizeUser(AccessLevels="Delete Invoice")] public ActionResult DeleteInvoice(int invoiceId) { // some code... return View(); } 

¿Es posible hacer esto? ¿Cómo? Gracias por adelantado…

Chatura

Podría hacer esto con un atributo personalizado de la siguiente manera.

 [AuthorizeUser(AccessLevel = "Create")] public ActionResult CreateNewInvoice() { //... return View(); } 

Clase de atributo personalizado de la siguiente manera.

 public class AuthorizeUserAttribute : AuthorizeAttribute { // Custom property public string AccessLevel { get; set; } protected override bool AuthorizeCore(HttpContextBase httpContext) { var isAuthorized = base.AuthorizeCore(httpContext); if (!isAuthorized) { return false; } string privilegeLevels = string.Join("", GetUserRights(httpContext.User.Identity.Name.ToString())); // Call another method to get rights of the user from DB return privilegeLevels.Contains(this.AccessLevel); } } 

Puede redirigir a un usuario no autorizado en su AuthorisationAttribute personalizado anulando el método HandleUnauthorizedRequest :

 protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary( new { controller = "Error", action = "Unauthorised" }) ); } 

Aquí hay una modificación para el anterior. responder. La principal diferencia es que cuando el usuario no está autenticado, utiliza el método original “HandleUnauthorizedRequest” para redirigir a la página de inicio de sesión:

  protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (filterContext.HttpContext.User.Identity.IsAuthenticated) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary( new { controller = "Account", action = "Unauthorised" }) ); } else { base.HandleUnauthorizedRequest(filterContext); } }