net mvc manage example asp and asp.net-mvc-3 redirect asp.net-membership roles unauthorized

manage - ASP.Net MVC 3 Redirigir al usuario no autorizado para que no inicie sesiónUrl



mvc security (6)

Tengo un proyecto que usa ASP.Net MVC3 y uso de membresía para roles. Yo uso autorizar en cada controlador. p.ej:

[Authorize(Roles = "Administrator")] public ActionResult Index(string q, int i) { return View(model); }

Si alguien no tiene un rol de administrador, se redirigirá a la página de inicio de sesión de forma predeterminada. ¿Cómo cambiarlo, para que se redirija a Views / Shared / UnAuthorize.cshtml? ¿O tal vez si alguien no tiene un rol de administrador, se mostrará un cuadro de mensaje (alerta)?

gracias por adelantado.


Bueno, puede heredar de AuthorizeAttribute y anular HandleUnauthorizedRequest que es responsable de la redirección de solicitudes no autorizadas / no autenticadas. Creo que esta pregunta te será útil.


El siguiente código ayudó y aquí está la referencia en el atributo Autorizado personalizado de ASP.NET MVC 4: ¿Cómo redirigir a los usuarios no autorizados a la página de error?

public class CustomAuthorize: AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if(!filterContext.HttpContext.User.Identity.IsAuthenticated) { base.HandleUnauthorizedRequest(filterContext); } else { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new{ controller = "Error", action = "AccessDenied" })); } } }


Mi propia versión, basada en ntep vodka''s:

public class CustomAuthorizeAttribute : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if(IsUserAuthenticated(filterContext.HttpContext)) { filterContext.Result = new RedirectResult("/Account/InvalidRole"); } else { base.HandleUnauthorizedRequest(filterContext); } } private bool IsUserAuthenticated(HttpContextBase context) { return context.User != null && context.User.Identity != null && context.User.Identity.IsAuthenticated; } }

De esta manera, obtengo un redireccionamiento estándar a la página de inicio de sesión para usuarios no autenticados, y un redireccionamiento personalizado para usuarios autenticados pero que no tienen el rol adecuado para la acción.


Simplemente cambie la página que debe mostrarse en web.config (verifique que exista la ruta)

<authentication mode="Forms"> <forms loginUrl="~/UnAuthorize" timeout="2880" /> </authentication>

Si, en cambio, desea redirigir a una ruta específica para cada función, puede extender el AuthorizeAttribute con la suya. Algo como esto (no probado, escribo esto para darle una idea)

public class CheckAuthorize : ActionFilterAttribute { public Roles[] Roles { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) { //Your code to get the user var user = ((ControllerBase)filterContext.Controller).GetUser(); if (user != null) { foreach (Role role in Roles) { if (role == user.Role) return; } } RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); if user.Role==Role.Administrator { redirectTargetDictionary.Add("action", "Unauthorized"); redirectTargetDictionary.Add("controller", "Home"); } else { redirectTargetDictionary.Add("action", "Logon"); redirectTargetDictionary.Add("controller", "Home"); } filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); } }


Yo uso este método y es muy fácil de implementar.

Asegurando Asp.net MVC3

Cambie su ruta predeterminada para iniciar sesión en global.asax


resolví mi problema solo hago esto

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; public class MyAuthorize : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { //you can change to any controller or html page. filterContext.Result = new RedirectResult("/cpanel/roles/unauthorize"); } }

y aplique MyAuthorize a la clase o acción:

[MyAuthorize] public class AdminController :Controller { }

Eso es.