151 votes

Rediriger depuis l'attribut de filtre d'action

Quelle est la meilleure façon de faire une redirection dans un ActionFilterAttribute . J'ai un ActionFilterAttribute appelé IsAuthenticatedAttributeFilter et qui a vérifié la valeur d'une variable de session. Si la variable est false, je souhaite que l'application soit redirigée vers la page de connexion. Je préférerais rediriger en utilisant le nom de la route SystemLogin mais toute méthode de redirection à ce stade serait satisfaisante.

206voto

CRice Points 4717

Ensemble filterContext.Résultat

Avec le nom de la route:

filterContext.Result = new RedirectToRouteResult("SystemLogin", routeValues);

Vous pouvez aussi faire quelque chose comme:

filterContext.Result = new ViewResult
{
    ViewName = SharedViews.SessionLost,
    ViewData = filterContext.Controller.ViewData
};

Si vous souhaitez utiliser RedirectToAction:

Vous pourriez faire un public RedirectToAction méthode sur votre contrôleur ou de contrôleur de base qui utilise le protégé de Système.Web.Mvc.Contrôleur ou, mieux encore, faire une forte tapé un.

public new RedirectToRouteResult RedirectToAction(string action, string controller)
{
    return base.RedirectToAction(action, controller);
}

Puis votre filtre ressemblerait à quelque chose comme:

   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
       var controller = (SomeControllerBase) filterContext.Controller;
       filterContext.Result = controller.RedirectToAction("index", "home");
   }

84voto

Syakur Rahman Points 340

Alternativement à une redirection, si elle appelle votre propre code, vous pouvez utiliser ceci:

 actionContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Error" }));
            actionContext.Result.ExecuteResult(actionContext.Controller.ControllerContext);
 

Ce n'est pas une redirection pure mais donne un résultat similaire sans surcharge inutile.

13voto

user2834076 Points 61

Je suis à l'aide de MVC4, j'ai utilisé la méthode suivante pour rediriger un code html personnalisé à l'écran au moment de l'autorisation de la violation.

Étendre AuthorizeAttribute dire CutomAuthorizer remplacer le OnAuthorization et HandleUnauthorizedRequest

Enregistrer le CustomAuthorizer dans le RegisterGlobalFilters.

public static void RegisterGlobalFilters(GlobalFilterCollection filtres) {

        filters.Add(new CustomAuthorizer());
    }

lors de l'identification de l'accès non autorisé à l'appeler HandleUnauthorizedRequest et rediriger à l'action du contrôleur comme indiqué ci-dessous.


 public class CustomAuthorizer : AuthorizeAttribute
{

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool isAuthorized = IsAuthorized(filterContext); // check authorization
        base.OnAuthorization(filterContext);
        if (!isAuthorized && !filterContext.ActionDescriptor.ActionName.Equals("Unauthorized", StringComparison.InvariantCultureIgnoreCase)
            && !filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.Equals("LogOn", StringComparison.InvariantCultureIgnoreCase))
        {

            HandleUnauthorizedRequest(filterContext);

        }
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result =
       new RedirectToRouteResult(
           new RouteValueDictionary{{ "controller", "LogOn" },
                                          { "action", "Unauthorized" }

                                         });

    }
}

9voto

Tomas Lycken Points 23432

Il semble que vous voulez ré-implémenter, ou éventuellement étendre, AuthorizeAttribute. Si oui, vous devriez assurez-vous que vous héritez, et pas ActionFilterAttribute, afin de laisser ASP.NET MVC faire plus de travail pour vous.

Aussi, vous voulez vous assurer que vous autorisez avant de vous faire tout le travail réel dans la méthode de l'action - dans le cas contraire, la seule différence entre connecté et pas de ce que la page que vous voyez lorsque le travail est effectué.

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        // Do whatever checking you need here

        // If you want the base check as well (against users/roles) call
        base.OnAuthorization(filterContext);
    }
}

Il y a une bonne question avec une réponse avec plus de détails ici sur.

6voto

msoliman Points 732

Essayez l'extrait suivant, cela devrait être assez clair:

 public class AuthorizeActionFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(FilterExecutingContext filterContext)
  {
    HttpSessionStateBase session = filterContext.HttpContext.Session;
    Controller controller = filterContext.Controller as Controller;

    if (controller != null)
    {
      if (session["Login"] == null)
      {
        filterContext.Cancel = true;
        controller.HttpContext.Response.Redirect("./Login");
      }
    }

    base.OnActionExecuting(filterContext);
  }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X