2010-02-02 2 views
12

J'ai une méthode décorée avec deux ActionFilterAttribute personnalisés.ASP.NET MVC: Response.Redirect (url, TRUE) n'arrête pas le traitement des demandes

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

RequiresAuthentication attribut vient this article

intérieur RequiresAuthentication, sur c'est OnActionExecuting que je fais:

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

La ligne est sont exécutées, et les arguments sont tous comme prévu. Le problème est qu'après l'exécution de la ligne ci-dessus, j'obtiens l'attribut suivant (ActionFilterAttribute) exécuté, comme si la redirection ne fonctionnait pas, il continuait juste d'exécuter la requête, au lieu de simplement rediriger le navigateur.

Question: Que dois-je faire pour rendre le gestionnaire de requêtes

Ceci est une méthode complète:

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

Répondre

26

Vous souhaitez définir le résultat sur le filterContext à un RedirectResult, ne pas effectuer de redirection sur la réponse.

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

EDIT: Comme @Hunter Daley suggère un meilleur mécanisme serait d'utiliser le AuthorizeAttribute au lieu si cela fonctionne pour vous. Si vous avez des scénarios d'authentification/d'autorisation pour lesquels AuthorizeAttribute ne fonctionne pas, il serait probablement préférable d'en déduire votre attribut personnalisé à la place du plus générique ActionFilterAttribute. Dans tous les cas, la technique correcte consiste à définir le résultat plutôt qu'à interagir directement avec la réponse. Vous voudrez peut-être regarder la source AuthorizeAttribute réelle au http://www.codeplex.com/aspnet pour des idées. J'ai aussi un échantillon du code custom authorization sur mon blog, http://farm-fresh-code.blogspot.com.

+0

Cela s'est avéré être la réponse dont j'avais besoin - je faisais une redirection sur la réponse, et pendant des mois je ne pouvais pas comprendre pourquoi je recevais des erreurs "Impossible de mettre des cookies". –

2

essayer d'ajouter l'attribut [Authorize] à vos méthodes d'action au lieu

+0

Oui, cela fonctionnerait aussi, sauf si vous avez un scénario d'autorisation/d'authentification plus compliqué. – tvanfosson

2

Ajouter

filterContext.HttpContext.Response.Clear(); 

au premier et ce à la fin:

filterContext.HttpContext.Response.End(); 

Hope this helps.

+2

N'a pas aidé: filterContext.HttpContext.Response.Redirect (loginUrl, true); le fait déjà à l'intérieur. –

0

Vous pouvez utiliser return RedirectToAction("Index", "Home/Login", new {area = "", returnURL = Request.Url.AbsolutePath}); pour arrêter le traitement en cours, rediriger vers la page (de connexion) souhaitée et quitter l'action. La propriété area route est nécessaire pour sortir de la zone actuelle si vous êtes dans.

Questions connexes