2010-03-18 9 views
50

Mit ASP.Net MVC 2, gibt es eine Möglichkeit, die RedirectToAction() Methode der Controller Klasse innerhalb einer Klasse zu verwenden, die auf der AuthorizeAttribute Klasse basiert?Kann RedirectToAction() in einer benutzerdefinierten AuthorizeAttribute-Klasse verwendet werden?

public class CustomAttribute : AuthorizeAttribute { 
    protected override bool AuthorizeCore(HttpContextBase context) { 
     // Custom authentication goes here 
     return false; 
    } 

    public override void OnAuthorization(AuthorizationContext context) { 
     base.OnAuthorization(context); 

     // This would be my ideal result 
     context.Result = RedirectToAction("Action", "Controller"); 
    } 
} 

Ich bin auf der Suche nach einem Weg, um den Benutzer zu einer bestimmten Controller/Aktion wieder direkt, wenn sie die Authentifizierung fehl, statt sie auf die Anmeldeseite zurück. Ist es möglich, dass die URL erneut für diesen Controller/diese Aktion generiert wird und dann RedirectResult()? Ich versuche, die Versuchung zu vermeiden, die URL nur hart zu codieren.

Antwort

94

Sie können HandleUnauthorizedRequest statt OnAuthorization überschreiben. Hier ist die Standardimplementierung:

protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
     filterContext.Result = new HttpUnauthorizedResult(); 
    } 

Sie nicht Controller.RedirectToAction verwenden können, aber Sie können eine neue RedirectToRouteResult zurückzukehren.

So können Sie tun:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
     filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary 
            { 
             { "action", "ActionName" }, 
             { "controller", "ControllerName" } 
            }); 
    } 
+1

Danke, das funktioniert. Guter Haken bei der Verwendung von HandleUnauthorizedRequest - Ich habe OnAuthorization verwendet, weil ich es in einem anderen Tutorial/einer anderen Diskussion gesehen habe (sie hatten eine benutzerdefinierte Eigenschaft, die gesetzt wurde, als die Authentifizierung fehlschlug und die Umleitung ausgelöst wurde). –

+0

@LanceMcNearney Was würde ich im Parameter filterContext übergeben? – Pomster

+0

@Craig Stuntz Was würde ich als FilterContext übergeben? – Pomster

11

Sie können etwas tun:

var routeValues = new RouteValueDictionary(); 
routeValues["controller"] = "ControllerName"; 
routeValues["action"] = "ActionName"; 
//Other route values if needed. 
context.Result = new RedirectToRouteResult(routeValues); 

Dies ist die Art und Weise ist der Rahmen, es tut, wenn Sie „RedirectToAction()“ in Ihrem Controller nennen.

+0

Was ist Kontext? Ich habe es rot unterstrichen? – Pomster

+0

@Pomster Überprüfen Sie die Frage, "Kontext" ist ein Parameter für die Methode, um die sich die Frage dreht. –

+0

Danke, Was würde passieren, um diese Arbeit zu machen? Ich habe gekämpft, um das zu funktionieren – Pomster

2

Falls jemand anderes in dieser Frage interessiert ist. Diese auf einfachere Art und Weise gelöst werden (zumindest mit MVC 3, weiß nicht, über MVC 2):

nur einen kleinen privaten Controller in Ihren benutzerdefiniert AuthorizeAttribute erstellen:

private class RedirectController : Controller 
    { 
     public ActionResult RedirectWhereever() 
     { 
      return RedirectToAction("Action", "Controller"); 
     } 

    } 

Dies kann leicht in Ihrer HandleUnauthorizedRequest-Methode verwendet werden (siehe Craigs-Antwort):

filterContext.Result = (new RedirectController()).RedirectWhereever(); 
+2

'RedirectToAction' gibt ein' RedirectToRouteResult' zurück, es besteht keine Notwendigkeit, einen Controller zu erstellen, nur um einen zurückzugeben, da @Craig Stuntz's geantwortet hat –

Verwandte Themen