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() ?
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
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
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