代码之家  ›  专栏  ›  技术社区  ›  Peter J

actionfilterattribute-应用于特定控制器类型的操作

  •  13
  • Peter J  · 技术社区  · 16 年前

    我正在使用actionfilterattribute执行自定义身份验证逻辑。该属性将仅用于包含我的身份验证逻辑的派生控制器类。

    这是我的控制器,从我的自定义控制器类派生,以及一个示例属性:

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

    以下是我的actionfilterattribute示例:

    public class CustomAuthorizeAttribute : ActionFilterAttribute
    {
       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;
          }
       }
    }
    

    工作很好。

    问题是: 我可以要求这个属性只用于我的自定义控制器类型中的操作吗?

    2 回复  |  直到 16 年前
        1
  •  15
  •   Jarrett Meyer    16 年前

    您可以将actionfilter放在类本身上。类中的所有操作都将实现ActionFilter。

    [CustomAuthorize]
    public class AuthorizedControllerBase : CustomControllerBase
    {
    }
    
    public class OpenAccessControllerBase : CustomControllerBase
    {
    }
    
    public class MyRealController : AuthorizedControllerBase 
    {
        // GET: /myrealcontroller/index
        public ActionResult Index()
        {
            return View();
        }
    }
    
        2
  •  7
  •   Peter J    16 年前

    基于我的系统的评论和约束,我采用了混合方法。基本上,如果请求是通过缓存路由来的,或者“用户”由于任何原因没有设置,那么身份验证就会以正确的方式失败。

    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
      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;
        string 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;
      }
    }