2010-03-18 32 views
50

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?¿Es posible usar RedirectToAction() dentro de una clase personalizada 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 volver a dirigir al usuario a un controlador/acción específica cuando fallan la autenticación en lugar de volver 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.

Respuesta

94

Puede/debe anular HandleUnauthorizedRequest en lugar de OnAuthorization. Aquí está la implementación por defecto:

protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
     filterContext.Result = new HttpUnauthorizedResult(); 
    } 

No puede utilizar Controller.RedirectToAction, pero puede devolver una nueva RedirectToRouteResult.

lo que puede 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" } 
            }); 
    } 
+1

Gracias, eso funciona. Buen uso de HandleUnauthorizedRequest - Estaba usando OnAuthorization porque lo vi en otro tutorial/discusión (tenían una propiedad personalizada que se estableció cuando falló la autenticación que desencadenaría la redirección). –

+0

@LanceMcNearney ¿Qué pasaría en el parámetro filterContext? – Pomster

+0

@Craig Stuntz ¿Qué pasaría como filterContext? – Pomster

11

se puede 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 el marco lo hace cuando se llama "RedirectToAction()" en su controlador.

+0

¿Qué es el contexto? Lo tengo subrayado en rojo? – Pomster

+0

@Pomster Echa un vistazo a la pregunta, "contexto" es un parámetro del método del que se trata la pregunta. –

+0

Gracias, ¿Qué pasaría para que esto funcione? Iv ha estado luchando para que esto funcione – Pomster

2

En caso de que alguien más está interesado en esta cuestión. Esto se puede solucionar de una manera más simple (al menos usando MVC 3, no sabemos acerca de MVC 2):

Basta con crear un pequeño controlador privada en su aduana AuthorizeAttribute:

private class RedirectController : Controller 
    { 
     public ActionResult RedirectWhereever() 
     { 
      return RedirectToAction("Action", "Controller"); 
     } 

    } 

Esto puede fácilmente ser utilizado en su método HandleUnauthorizedRequest (vea la respuesta de Craigs):

filterContext.Result = (new RedirectController()).RedirectWhereever(); 
+2

'RedirectToAction' devuelve un' RedirectToRouteResult', no hay necesidad de crear un controlador solo para devolver uno, ya que @Craig Stuntz respondió –

Cuestiones relacionadas