7

Ich habe eine CustomeAuthorize Aktion Filter, der den Benutzer an die Anmeldeseite weiterleitet, wenn der Benutzer nicht authentifiziert ist. Ich wende diesen Filter auf Aktionen oder Controller an.ASP.NET MVC - CustomeAuthorize Filteraktion mit einer externen Website für die Anmeldung im Benutzer

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

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

Nun sagen 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 täte:

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 des CustomAuthorize-Filters ist beendet, die Ausführung geht weiter zu MyAction, was nicht das ist, was ich möchte! Wie kann ich die Ausführung von MyAction nach dem Filter in diesem Fall stoppen?

-Update- Ich bin gerade auf ein neues Problem gestoßen. Meine MVC-Anwendung ist in einem iFrame und ich möchte die Redirect den aktuellen Frame als der 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 ?

Antwort

11

Verwenden Sie das RedirectResult ähnlich wie zuvor RedirectToRouteResult, um das Ergebnis im Filterkontext zu ersetzen.

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

Danke für den Tipp. Ich bin gerade auf ein neues Problem gestoßen. Meine MVC-Anwendung befindet sich in einem iFrame und ich möchte, dass die Umleitung den aktuellen Frame nach der Umleitung als Hauptframe erzwingt, also mache ich etwas wie: filterContext.HttpContext.Response.Write (""); Gibt es eine Möglichkeit, ein JavaScript an RedirectResult() zu übergeben? – xraminx

+0

Sie können versuchen, eine tatsächliche Ansicht zurückzugeben, die das richtige Javascript enthält, um die Umleitung auszuführen. Es gibt auch ein JavaScript-Ergebnis, das Sie ausprobieren könnten. Ich habe das nicht benutzt. – tvanfosson

+0

das JavaScriptResult würde das zurückgegebene Javascript innerhalb

 Block schreiben! Ich weiß nicht warum. Ich habe einfach eine Dummy-Aktion gemacht, die nur die Weiterleitung für mich gemacht und an diese Aktion weitergeleitet hat, genauso wie ich es im ersten Fall oben gezeigt habe. Danke für deine Hilfe :) –
                        
                            
    xraminx
                                
                            
                        
                    

1

Lassen Sie mich sehen, wenn ich verstehe - Sie haben einen iFrame und führen eine Aktion in diesem iFrame aus. Sie möchten auf eine übergeordnete Seite umleiten, nicht in diesem iFrame?

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

+0

Redirect (URL) von einem iFrame bringt nur URL in den iFrame. – Dronz

0

Sie können eine Beurteilung von jQuery auf der Anmeldeseite hinzufü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>" }; 
Verwandte Themen