ASP.NET MVC - Action de filtrage CustomeAuthorize à l'aide d'un site Web externe pour la connexion à l'utilisateur

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

Question

J'ai un filtre d'action CustomeAuthorize qui transfère l'utilisateur à la page de connexion s'il n'est pas authentifié. J'applique ce filtre aux actions ou aux contrôleurs.

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

et le filtre ressemble à ceci:

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);
        }
    }
}

Une fois que j'attribue une valeur à filterContext.Result, une fois l'exécution du filtre terminée, l'exécution est (en quelque sorte?!) redirigée vers l'action SignIn et MyAction ne s'exécute pas. C’est exactement ce que je veux.

Maintenant, disons que je veux changer mon CustomAuthorize pour authentifier l'utilisateur par rapport à un site Web externe et non à ma propre action de connexion, de sorte que je fais quelque chose comme ceci:

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);
        }
    }
}

Mon problème est qu'après l'exécution de la deuxième version du filtre CustomAuthorize, l'exécution se poursuit sur MyAction, ce qui n'est pas ce que je souhaite! Comment puis-je arrêter l'exécution de MyAction après le filtre dans ce cas?

-Update - je viens de rencontrer un nouveau problème. Mon application MVC est dans un iFrame et je veux que la redirection force le cadre actuel comme cadre principal après la redirection. Je fais donc quelque chose comme:

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

Existe-t-il un moyen de transmettre un code javascript à RedirectResult ()?

Était-ce utile?

La solution

Utilisez le RedirectResult de la même manière que vous utilisiez auparavant le RedirectToRouteResult pour remplacer le résultat dans le contexte du filtre.

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

Autres conseils

Laissez-moi voir si je comprends bien - vous avez un iFrame et vous exécutez une action dans cet iFrame. Vous souhaitez rediriger vers une page parent, pas dans cette iFrame?

Si oui, utilisez simplement Redirect (url) dans votre action.

Vous pouvez ajouter un jugement par jQuery sur la page de connexion.

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

OU

éditez 'filterContext.Result' dans l'action 'OnActionExecuting'

filterContext.Result = new ContentResult() { Content = "<script>top.window.location.href='/user/Login'</script>" };
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top