Solución:
Establecer filterContext.Result
Con el nombre de la ruta:
filterContext.Result = new RedirectToRouteResult("SystemLogin", routeValues);
También puedes hacer algo como:
filterContext.Result = new ViewResult
{
ViewName = SharedViews.SessionLost,
ViewData = filterContext.Controller.ViewData
};
Si quieres usar RedirectToAction
:
Podrías hacer un público RedirectToAction
método en su controladorpreferiblemente en su controlador base) que simplemente llama al protegido RedirectToAction
de System.Web.Mvc.Controller
. Agregar este método permite una llamada pública a tu RedirectToAction
del filtro.
public new RedirectToRouteResult RedirectToAction(string action, string controller)
{
return base.RedirectToAction(action, controller);
}
Entonces su filtro se vería así:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = (SomeControllerBase) filterContext.Controller;
filterContext.Result = controller.RedirectToAction("index", "home");
}
Alternativamente a una redirección, si está llamando a su propio código, puede usar esto:
actionContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(new { controller = "Home", action = "Error" })
);
actionContext.Result.ExecuteResult(actionContext.Controller.ControllerContext);
No es una redirección pura, pero da un resultado similar sin una sobrecarga innecesaria.
Estoy usando MVC4, utilicé el siguiente enfoque para redirigir una pantalla html personalizada en caso de incumplimiento de autorización.
Ampliar AuthorizeAttribute
decir CutomAuthorizer
anular el OnAuthorization
y HandleUnauthorizedRequest
Registre el CustomAuthorizer
en el RegisterGlobalFilters
.
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomAuthorizer());
}
al identificar el unAuthorized
acceso a llamada HandleUnauthorizedRequest
y redirigir a la acción del controlador en cuestión como se muestra a continuación.
public class CustomAuthorizer : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
bool isAuthorized = IsAuthorized(filterContext); // check authorization
base.OnAuthorization(filterContext);
if (!isAuthorized && !filterContext.ActionDescriptor.ActionName.Equals("Unauthorized", StringComparison.InvariantCultureIgnoreCase)
&& !filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.Equals("LogOn", StringComparison.InvariantCultureIgnoreCase))
{
HandleUnauthorizedRequest(filterContext);
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result =
new RedirectToRouteResult(
new RouteValueDictionary{{ "controller", "LogOn" },
{ "action", "Unauthorized" }
});
}
}