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.
Réponses
Trop de publicités?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");
}
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.
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" }
});
}
}
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.
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);
}
}