ASP.NET MVC - CustomeAuthorize Action-Filter eine externe Website für loggin in dem Benutzer unter Verwendung von

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

Frage

Ich habe einen CustomeAuthorize Action-Filter, der den Benutzer leitet Seite signin, wenn der Benutzer nicht authentifiziert ist. Ich wende diese Filter, um Aktionen oder Controller.

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

und die Filter wie folgt aussehen:

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

Wenn ich einen Wert filterContext.Result, nach der Ausführung des Filters beendet zuweisen, ist die Ausführung (irgendwie ?!) der Wirkung SignIn umgeleitet und MyAction wird nicht ausgeführt. Das ist genau das, was ich will.

Nun sage ich mag, dass mein CustomAuthorize ändern, um die Benutzer gegen eine externe Website und nicht meine eigene SignIn Aktion zu authentifizieren, so dass ich so etwas wie dies tue:

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

Mein Problem ist, , dass nach der Ausführung der zweiten Version von CustomAuthorize Filter beendet ist, wird die Ausführung zu MyAction weiter das ist nicht das, was ich will! Wie kann ich in diesem Fall die Ausführung von MyAction nach Filter stoppen?

-Update - Ich habe gerade ein neues Thema. Meine MVC-Anwendung ist in einem iFrame und ich mag die Redirect den aktuellen Frame als den Hauptrahmen nach Umleitung erzwingen, so dass ich tue so etwas wie:

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

Gibt es eine Möglichkeit, eine Javascript RedirectResult () übergeben?

War es hilfreich?

Lösung

Mit der RedirectResult ähnlich, wie Sie die RedirectToRouteResult wurden unter Verwendung, bevor das Ergebnis im Filter Kontext zu ersetzen.

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

Andere Tipps

Lassen Sie mich sehen, ob ich verstehe - Sie einen iFrame haben, und innerhalb dieser iFrame eine Aktion ausgeführt wird. Sie möchten eine übergeordnete Seite umleiten, nicht innerhalb dieser iFrame?

Wenn ja, nur Redirect verwenden (URL) in Ihrer Aktion.

Sie können eine Beurteilung von jQuery auf der Login-Seite hinzuzufügen.

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

oder

Bearbeiten 'filterContext.Result' in Aktion 'OnActionExecuting'

filterContext.Result = new ContentResult() { Content = "<script>top.window.location.href='/user/Login'</script>" };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top