asp.net-mvc - example - authorized asp net mvc
¿Es posible usar RedirectToAction() dentro de una clase personalizada AuthorizeAttribute? (3)
Usando ASP.Net MVC 2, ¿hay alguna forma de utilizar el método RedirectToAction() de la clase Controller dentro de una clase que se basa en la clase AuthorizeAttribute
?
public class CustomAttribute : AuthorizeAttribute {
protected override bool AuthorizeCore(HttpContextBase context) {
// Custom authentication goes here
return false;
}
public override void OnAuthorization(AuthorizationContext context) {
base.OnAuthorization(context);
// This would be my ideal result
context.Result = RedirectToAction("Action", "Controller");
}
}
Estoy buscando una manera de redirigir al usuario a un controlador / acción específica cuando falla la autenticación en lugar de devolverlos a la página de inicio de sesión. ¿Es posible tener la URL redirigida generada para ese controlador / acción y luego usar RedirectResult() ? Estoy tratando de evitar la tentación de simplemente codificar la URL.
En caso de que alguien más esté interesado en esta pregunta. Esto se puede resolver de una manera más simple (al menos usando MVC 3, no sé sobre MVC 2):
Simplemente cree un pequeño controlador privado en su CustomizeAttribute personalizado:
private class RedirectController : Controller
{
public ActionResult RedirectWhereever()
{
return RedirectToAction("Action", "Controller");
}
}
Esto se puede usar fácilmente en su método HandleUnauthorizedRequest (vea la respuesta de Craigs):
filterContext.Result = (new RedirectController()).RedirectWhereever();
Puede / debe anular HandleUnauthorizedRequest
lugar de OnAuthorization
. Aquí está la implementación predeterminada:
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
// Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
filterContext.Result = new HttpUnauthorizedResult();
}
No puede usar Controller.RedirectToAction
, pero puede devolver un nuevo RedirectToRouteResult
.
Entonces puedes hacer:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
// Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "action", "ActionName" },
{ "controller", "ControllerName" }
});
}
Puedes hacer algo como esto:
var routeValues = new RouteValueDictionary();
routeValues["controller"] = "ControllerName";
routeValues["action"] = "ActionName";
//Other route values if needed.
context.Result = new RedirectToRouteResult(routeValues);
Esta es la forma en que lo hace el marco cuando llamas a "RedirectToAction ()" en tu controlador.