2010-02-02 94 views
12

Tengo un método decorado con dos ActionFilterAttribute personalizado.ASP.NET MVC: Response.Redirect (url, TRUE) no detiene el proceso de solicitud

[RequiresAuthentication(Order = 1)] 
[ToonAction(Order = 2)] 
public ActionResult Browse(... 

RequiresAuthentication atributo proviene de this article

Dentro RequiresAuthentication, en la que está OnActionExecuting hago:

filterContext.HttpContext.Response.Redirect(loginUrl, true); 

La línea se se ejecutan, y los argumentos son todos como se esperaba. El problema es que después de ejecutar la línea anterior, obtengo el siguiente atributo (ActionFilterAttribute) ejecutado, como si el redireccionamiento no funcionara, simplemente continúa ejecutando la solicitud, en lugar de simplemente redirigir el navegador.

Pregunta: qué más qué necesito hacer para que el controlador de solicitudes

Este es un método completo:

public override void OnActionExecuting(ActionExecutingContext filterContext) { 
     //redirect if not authenticated 
     var identity = filterContext.HttpContext.User.Identity; 
     if (!identity.IsAuthenticated) { 
      //use the current url for the redirect 
      string redirectOnSuccess = filterContext.HttpContext.Request.Url.PathAndQuery; 

      //send them off to the login page 
      string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess); 
      string loginUrl = FormsAuthentication.LoginUrl + redirectUrl; 
      filterContext.HttpContext.Response.Redirect(loginUrl, true); 
      // filterContext.Result = new HttpUnauthorizedResult(); 
      // filterContext.HttpContext.Response.StatusCode = 0x191; 
     } 
    } 

Respuesta

26

Desea establecer el resultado en el filterContext en un RedirectResult, no hacer un redireccionamiento en la respuesta.

filterContext.Result = new RedirectResult { Url = loginUrl }; 

EDIT: Como @Hunter Daley sugiere un mecanismo mejor sería utilizar el AuthorizeAttribute lugar si funciona para usted. Si tiene escenarios de autenticación/autorización para los que no funciona el atributo Autorizar, probablemente sea mejor derivar su atributo personalizado de él en lugar del más genérico atributo de filtro de acción. En cualquier caso, la técnica correcta es establecer el resultado en lugar de interactuar directamente con la respuesta. Es posible que desee consultar la fuente real AuthorizeAttribute en http://www.codeplex.com/aspnet para obtener ideas.

Tengo una muestra del código custom authorization en mi blog, http://farm-fresh-code.blogspot.com, también.

+0

Esto resultó ser la respuesta que necesitaba: estaba haciendo una redirección en la respuesta, y durante meses no pude entender por qué recibía los errores de "No se puede establecer la cookie". –

2

intento de añadir el atributo [Autorizar] a sus métodos de acción en lugar

+0

Sí, eso también funcionaría, a menos que tenga un escenario de autorización/autenticación más complicado. – tvanfosson

2

Añadir

filterContext.HttpContext.Response.Clear(); 

en un primer momento y esto al Final:

filterContext.HttpContext.Response.End(); 

Espero que esto ayude.

+2

No ayudó: filterContext.HttpContext.Response.Redirect (loginUrl, true); ya lo hace adentro –

0

puede usar return RedirectToAction("Index", "Home/Login", new {area = "", returnURL = Request.Url.AbsolutePath}); para detener el procesamiento actual, redirigir a la página deseada (inicio de sesión) y salir de la acción. la propiedad de ruta area es necesaria para salir del área actual si se encuentra en alguna.

Cuestiones relacionadas