mvc example custom authorizeattribute attribute asp.net-mvc-4 authorization custom-attributes

asp.net-mvc-4 - example - authorizeattribute mvc



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

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


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


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