ActionFilterAtsortingbute – s’applique aux actions d’un type de contrôleur spécifique

J’utilise un ActionFilterAtsortingbute pour créer une logique d’authentification personnalisée. L’atsortingbut ne sera utilisé que sur une classe de contrôleur dérivée contenant ma logique d’authentification.

Voici mon contrôleur, dérivé de ma classe de contrôleur personnalisé, et un exemple d’atsortingbut:

public class MyController : CustomControllerBase { [CustomAuthorize(UserType = UserTypes.Admin)] public ActionResult DoSomethingSecure() { return View(); } } 

Voici un exemple de mon ActionFilterAtsortingbute:

 public class CustomAuthorizeAtsortingbute : ActionFilterAtsortingbute { public MyUserTypes UserType { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) { myUser user = ((CustomControllerBase)filterContext.Controller).User; if(!user.isAuthenticated) { filterContext.RequestContext.HttpContext.Response.StatusCode = 401; } } } 

Fonctionne très bien.

Voici la question: Puis-je exiger que cet atsortingbut ne soit utilisé que sur des actions dans mon type de contrôleur personnalisé?

Vous pouvez mettre ActionFilter sur la classe elle-même. Toutes les actions de la classe réaliseront le filtre ActionFilter.

 [CustomAuthorize] public class AuthorizedControllerBase : CustomControllerBase { } public class OpenAccessControllerBase : CustomControllerBase { } public class MyRealController : AuthorizedControllerBase { // GET: /myrealcontroller/index public ActionResult Index() { return View(); } } 

Sur la base des commentaires et des contraintes de mon système, j’ai adopté une approche hybride. Fondamentalement, si la requête parvient via une route mise en cache ou si “l’utilisateur” n’est pas défini pour une raison quelconque, l’authentification échoue correctement.

 public class CustomAuthorizeAtsortingbute : AuthorizeAtsortingbute { private MyUser User { get; set; } public override void OnAuthorization(AuthorizationContext filterContext) { //Lazy loads the user in the controller. User = ((MyControllerBase)filterContext.Controller).User; base.OnAuthorization(filterContext); } protected override bool AuthorizeCore(HttpContextBase httpContext) { bool isAuthorized = false; ssortingng retLink = httpContext.Request.Url.AbsolutePath; if(User != null) { isAuthorized = User.IsValidated; } if (!isAuthorized) { //If the current request is coming in via an AJAX call, //simply return a basic 401 status code, otherwise, //redirect to the login page. if (httpContext.Request.IsAjaxRequest()) { httpContext.Response.StatusCode = 401; } else { httpContext.Response.Redirect("/login?retlink=" + retLink); } } return isAuthorized; } }