2010-02-02 12 views
12

Ich habe eine Methode mit zwei benutzerdefinierten ActionFilterAttribute eingerichtet.ASP.NET MVC: Response.Redirect (URL, TRUE) nicht Anforderungsverarbeitung

[RequiresAuthentication(Order = 1)] 
[ToonAction(Order = 2)] 
public ActionResult Browse(... 

RequiresAuthentication Attribut kommt von this article

Innen RequiresAuthentication, auf es OnActionExecuting ich tun:

filterContext.HttpContext.Response.Redirect(loginUrl, true); 

Die Linie wird ausgeführt werden sollen, und die Argumente sind wie erwartet. Das Problem ist, dass nach dem Ausführen der Zeile oben, ich nächste Attribut (ActionFilterAttribute) ausgeführt, als ob redirect nicht funktioniert, es nur weiter die Anfrage ausführt, anstatt einfach Browser umleiten.

Frage: was sonst muss ich tun, um den Request-Handler

Dies ist eine komplette Methode zu machen:

public override void OnActionExecuting(ActionExecutingContext filterContext) { 
     //redirect if not authenticated 
     var identity = filterContext.HttpContext.User.Identity; 
     if (!identity.IsAuthenticated) { 
      //use the current url for the redirect 
      string redirectOnSuccess = filterContext.HttpContext.Request.Url.PathAndQuery; 

      //send them off to the login page 
      string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess); 
      string loginUrl = FormsAuthentication.LoginUrl + redirectUrl; 
      filterContext.HttpContext.Response.Redirect(loginUrl, true); 
      // filterContext.Result = new HttpUnauthorizedResult(); 
      // filterContext.HttpContext.Response.StatusCode = 0x191; 
     } 
    } 

Antwort

26

Sie möchten das Ergebnis für den FilterContext zu einem RedirectResult festlegen, keine Umleitung für die Antwort.

filterContext.Result = new RedirectResult { Url = loginUrl }; 

EDIT: Als @Hunter Daley einen besseren Mechanismus schlägt die AuthorizeAttribute stattdessen zu verwenden wäre, wenn es für Sie arbeitet. Wenn Sie über Authentifizierungs-/Autorisierungsszenarios verfügen, für die das AuthorizeAttribute nicht funktioniert, wäre es wahrscheinlich besser, Ihr benutzerdefiniertes Attribut als das generische ActionFilterAttribute abzuleiten. In jedem Fall besteht die richtige Technik darin, das Ergebnis festzulegen, anstatt direkt mit der Antwort zu interagieren. Sie können sich die aktuelle AuthorizeAttribute-Quelle unter http://www.codeplex.com/aspnet für Ideen ansehen.

Ich habe ein Beispiel von custom authorization Code auf meinem Blog, http://farm-fresh-code.blogspot.com, auch.

+0

Dies erwies sich als die Antwort, die ich brauchte - ich machte eine Umleitung auf die Antwort, und für Monate konnte ich nicht herausfinden, warum ich "Fehler beim Setzen von Cookies" bekam. –

2

Versuchen Sie, die [autorisieren] Attribut auf der Aktionsmethoden statt

+0

Ja, das würde auch funktionieren, außer Sie haben ein komplizierteres Autorisierungs-/Authentifizierungsszenario. – tvanfosson

2

filterContext.HttpContext.Response.Clear(); 

zunächst und dies zu Ende hinzufügen:

filterContext.HttpContext.Response.End(); 

Hoffnung, das hilft.

+2

Hat nicht geholfen: filterContext.HttpContext.Response.Redirect (loginUrl, true); macht es schon drinnen. –

0

können Sie return RedirectToAction("Index", "Home/Login", new {area = "", returnURL = Request.Url.AbsolutePath}); verwenden, um die aktuelle Verarbeitung zu stoppen, leiten die Aktion auf die gewünschte (Login) Seite und beenden. Die Routeneigenschaft area wird benötigt, um aus dem aktuellen Bereich herauszukommen, wenn Sie sich in einem befinden.