ASP.NET MVC: acción de filtro CustomeAuthorize utilizando un sitio web externo para iniciar sesión en el usuario

StackOverflow https://stackoverflow.com/questions/835672

Pregunta

Tengo un filtro de acción CustomeAuthorize que reenvía al usuario a la página de inicio de sesión si el usuario no está autenticado. Aplico este filtro a acciones o controladores.

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

y el filtro se ve así:

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 asigno un valor a filterContext.Result, después de que finaliza la ejecución del filtro, la ejecución se redirige (de alguna manera ?!) a la acción Iniciar sesión y MyAction no se ejecuta. Esto es exactamente lo que quiero.

Ahora diga que quiero cambiar mi CustomAuthorize para autenticar al usuario en un sitio web externo y no en mi propia acción de inicio de sesión, así 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 que finalice la ejecución de la segunda versión del filtro CustomAuthorize, ¡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?

-Update- Acabo de encontrar un nuevo problema. Mi aplicación MVC está en un iFrame y quiero que Redirect fuerce el marco actual como el marco principal después de la redirección, así 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 alguna manera de pasar un javascript a RedirectResult ()?

¿Fue útil?

Solución

Use RedirectResult de forma similar a como usaba RedirectToRouteResult antes para reemplazar el resultado en el contexto del filtro.

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

Otros consejos

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

Si es así, solo usa Redirect (url) en tu acción.

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

edite 'filterContext.Result' en la acción 'OnActionExecuting'

filterContext.Result = new ContentResult() { Content = "<script>top.window.location.href='/user/Login'</script>" };
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top