2009-05-07 23 views
7

Tengo un filtro de acción CustomeAuthorize que reenvía al usuario para iniciar sesión en la página si el usuario no está autenticado. Aplico este filtro a acciones o controladores.ASP.NET MVC - Acción de filtro CustomeAuthorize utilizando un sitio web externo para el inicio de sesión en el usuario

[CustumeAuthorize] 
public ActionResult MyAction() 
{ 
    //do something here 
    return View(); 
} 

y el filtro se parece a esto:

public class CustomAuthorizeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if (!currentUserIsAuthenticated) 
     { 

      filterContext.Result = 
       new RedirectToRouteResult(
        new RouteValueDictionary{{ "controller", "Account" }, 
               { "action", "SignIn" }, 
               { "returnUrl", filterContext.HttpContext.Request.RawUrl } 
               }); 
     } 
     else 
     { 
      base.OnActionExecuting(filterContext); 
     } 
    } 
} 

Una vez que asigna un valor a filterContext.Result, después de la ejecución de los acabados de filtro, la ejecución es (de alguna manera ?!) redirige a la acción SignIn y MyAction no se ejecuta. Esto es exactamente lo que quiero.

Ahora digo que quiero cambiar mi CustomAuthorize para autenticar al usuario frente a un sitio web externo, y no mi propia acción SignIn por lo que estoy haciendo algo como esto:

public class CustomAuthorizeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if (!currentUserIsAuthenticated) 
     { 
      filterContext.HttpContext.Response.Redirect("http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl); 
     } 
     else 
     { 
      base.OnActionExecuting(filterContext); 
     } 
    } 
} 

Mi problema es que después de la ejecución de la segunda versión del filtro CustomAuthorize ha finalizado, la ejecución continúa en MyAction, que no es lo que quiero. ¿Cómo detengo la ejecución de MyAction después del filtro en este caso?

-Actualización- Acabo de encontrar un nuevo problema. Mi aplicación MVC es en un marco flotante y quiero la redirección para forzar el cuadro actual como el marco principal después de redirección, por lo que estoy haciendo algo como:

string url = "http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl; 
filterContext.HttpContext.Response.Write("<script type=\"text/javascript\">\ntop.location.href = \"" + url + "\";</script>"); 

¿Hay una manera de pasar un javascript para RedirectResult() ?

Respuesta

11

Utilice RedirectResult de forma similar a como estaba usando el RedirectToRouteResult antes para reemplazar el resultado en el contexto del filtro.

filterContext.Result = new RedirectResult("http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl); 
+1

Gracias por la punta. Me encontré con un nuevo problema. Mi aplicación MVC está en un iFrame y quiero que Redirect fuerce el fotograma actual como el fotograma principal después de la redirección, así que estoy haciendo algo como: filterContext.HttpContext.Response.Write (""); ¿Hay alguna manera de pasar un javascript a RedirectResult()? – xraminx

+0

Es posible que desee intentar devolver una Vista real que contiene el Javascript correcto para hacer la redirección. También hay un JavaScriptResult, que puede probar. No he usado eso. – tvanfosson

+0

JavaScriptResult escribiría el javascript devuelto dentro del bloque

! No sé por qué. Simplemente hice una acción falsa, hice el reenvío para mí y lo envié a esa acción tal como lo hice en el primer caso demostrado anteriormente. Gracias por su ayuda :) –
                        
                            
    xraminx
                                
                            
                        
                    

1

Déjame ver si entiendo: tienes un iFrame y estás ejecutando una acción dentro de este iFrame. ¿Desea redirigir a una página principal, no dentro de ese iFrame?

Si es así, simplemente use Redirect (url) en su acción.

+0

Redirigir (url) de un iFrame solo coloca url en el iFrame. – Dronz

0

Puede agregar un juicio por jQuery en la página de inicio de sesión.

$(function() { 
     if (window != top) { 
      top.location.href = location.href; 
     } 
    }); 

O

editar 'filterContext.Result' en acción 'OnActionExecuting'

filterContext.Result = new ContentResult() { Content = "<script>top.window.location.href='/user/Login'</script>" }; 
Cuestiones relacionadas