Reindirizza dall’attributo del filtro azione

Qual è il modo migliore per eseguire un reindirizzamento in ActionFilterAttribute . Ho un ActionFilterAttribute chiamato IsAuthenticatedAttributeFilter e che ha controllato il valore di una variabile di sessione. Se la variabile è false, voglio che l’applicazione reindirizzi alla pagina di accesso. Preferirei redirect usando il nome di percorso SystemLogin tuttavia qualsiasi metodo di reindirizzamento a questo punto andrebbe bene.

Imposta filterContext.Result

Con il nome della rotta:

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

Puoi anche fare qualcosa come:

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

Se si desidera utilizzare RedirectToAction :

È ansible creare un metodo RedirectToAction pubblico sul controller ( preferibilmente sul controller di base ) che richiama semplicemente il RedirectToAction protetto da System.Web.Mvc.Controller . L’aggiunta di questo metodo consente una chiamata pubblica a RedirectToAction dal filtro.

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

Quindi il tuo filtro sarebbe simile a qualcosa:

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

In alternativa a un reindirizzamento, se si sta chiamando il proprio codice, è ansible utilizzare questo:

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

Non è un reindirizzamento puro, ma fornisce un risultato simile senza costi aggiuntivi non necessari.

Sto usando MVC4, ho usato il seguente approccio per redirect uno schermo html personalizzato in caso di violazione dell’authorization.

Estendi AuthorizeAttribute dire che CutomAuthorizer la precedenza su OnAuthorization e HandleUnauthorizedRequest

Registra CustomAuthorizer in RegisterGlobalFilters .

 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomAuthorizer()); } 

dopo aver identificato la chiamata di accesso non unAuthorized HandleUnauthorizedRequest e redirect all’azione del controller interessato come mostrato di seguito.


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

Sembra che tu voglia reimplementare, o eventualmente estendere, AuthorizeAttribute . In tal caso, assicurati di ereditarlo e non di ActionFilterAttribute , in modo da consentire a ASP.NET MVC di svolgere più del lavoro per te.

Inoltre, devi assicurarti di autorizzarti prima di eseguire qualsiasi operazione reale nel metodo di azione; in caso contrario, l’unica differenza tra l’accesso e non sarà la pagina visualizzata al termine del lavoro.

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

C’è una buona domanda con una risposta con maggiori dettagli qui su SO.

Prova il seguente frammento, dovrebbe essere abbastanza chiaro:

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

potresti ereditare il tuo controller e poi usarlo nel tuo filtro azione

all’interno della class ActionFilterAttribute:

  if( filterContext.Controller is MyController ) if(filterContext.HttpContext.Session["login"] == null) (filterContext.Controller as MyController).RedirectToAction("Login"); 

all’interno del tuo controller di base:

 public class MyController : Controller { public void RedirectToAction(string actionName) { base.RedirectToAction(actionName); } } 

Cons. di questo è quello di cambiare tutti i controller per ereditare dalla class “MyController”

Ecco una soluzione che tiene in considerazione anche se si utilizzano le richieste Ajax.

 using System; using System.Web.Mvc; using System.Web.Routing; namespace YourNamespace{ [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class AuthorizeCustom : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { if (YourAuthorizationCheckGoesHere) { string area = "";// leave empty if not using area's string controller = "ControllerName"; string action = "ActionName"; var urlHelper = new UrlHelper(context.RequestContext); if (context.HttpContext.Request.IsAjaxRequest()){ // Check if Ajax if(area == string.Empty) context.HttpContext.Response.Write($""); else context.HttpContext.Response.Write($""); } else // Non Ajax Request context.Result = new RedirectToRouteResult(new RouteValueDictionary( new{ area, controller, action })); } base.OnActionExecuting(context); } } }