ASP.NET MVC - CustomeAutorizzazione dell'azione filtro mediante un sito Web esterno per l'accesso dell'utente

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

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

È stato utile?

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>" };
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top