ASP.NET MVC - CustomeAutorizzazione dell'azione filtro mediante un sito Web esterno per l'accesso dell'utente
-
08-07-2019 - |
Domanda
Ho un filtro azioni CustomeAuthorize che inoltra l'utente alla pagina di accesso se l'utente non è autenticato. Applico questo filtro ad azioni o controller.
[CustumeAuthorize]
public ActionResult MyAction()
{
//do something here
return View();
}
e il filtro è simile al seguente:
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);
}
}
}
Dopo aver assegnato un valore a filterContext.Result, al termine dell'esecuzione del filtro, l'esecuzione viene (in qualche modo ?!) reindirizzata all'azione SignIn e MyAction non viene eseguita. Questo è esattamente quello che voglio.
Ora dì che voglio cambiare il mio CustomAuthorize per autenticare l'utente rispetto a un sito Web esterno e non la mia azione SignIn, quindi sto facendo qualcosa del genere:
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);
}
}
}
Il mio problema è che dopo l'esecuzione della seconda versione del filtro CustomAuthorize, l'esecuzione continua su MyAction che non è quello che voglio! Come posso interrompere l'esecuzione di MyAction dopo il filtro in questo caso?
-Aggiornamento- Ho appena riscontrato un nuovo problema. La mia applicazione MVC è in un iFrame e voglio che il reindirizzamento imponga il frame corrente come frame principale dopo il reindirizzamento, quindi sto facendo qualcosa del tipo:
string url = "http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl;
filterContext.HttpContext.Response.Write("<script type=\"text/javascript\">\ntop.location.href = \"" + url + "\";</script>");
C'è un modo per passare un javascript a RedirectResult ()?
Soluzione
Usa RedirectResult in modo simile a come stavi usando RedirectToRouteResult prima di sostituire il risultato nel contesto del filtro.
filterContext.Result = new RedirectResult("http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl );
Altri suggerimenti
Fammi vedere se ho capito: hai un iFrame ed esegui un'azione all'interno di questo iFrame. Vuoi reindirizzare a una pagina principale, non all'interno di quell'iFrame?
In tal caso, usa semplicemente Redirect (url) nella tua azione.
Puoi aggiungere un giudizio di jQuery nella pagina di accesso.
$(function () {
if (window != top) {
top.location.href = location.href;
}
});
o
modifica 'filterContext.Result' nell'azione 'OnActionExecuting'
filterContext.Result = new ContentResult() { Content = "<script>top.window.location.href='/user/Login'</script>" };