代码之家  ›  专栏  ›  技术社区  ›  RSolberg

如何使用参数值为控制器定制authorizeAttribute?

  •  6
  • RSolberg  · 技术社区  · 14 年前

    我试图保护一个控制器操作,以防止用户访问他们无权访问的实体。我可以用下面的代码来完成这项工作。

    public ActionResult Entity(string entityCode)
    {
        if (CurrentUser.VerifyEntityPermission(entityCode))
        {
            //populate viewModel...
            return View(viewModel);
        }
        return RedirectToAction("NoAccessToEntity", "Error");
    }
    

    我希望能够向控制器操作本身添加一个属性。为了验证对实体的访问,我需要查看传递给控制器的值以及用户可以访问的实体。这有可能吗?

    [EntityAuthRequired]
    public ActionResult Entity(string entityCode)
    {
            //populate viewModel...
            return View(viewModel);
    }
    
    1 回复  |  直到 11 年前
        1
  •  3
  •   RSolberg    14 年前

    像这样的东西可能会帮助你。尽管您可能希望向属性添加一些附加属性,以允许您在每个操作上指定EntityCode参数,而不是对其进行硬编码。

    public class EntityAuthRequired : FilterAttribute, IAuthorizationFilter 
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            //Make sure that this is not NULL before assigning value as string...
            var entityCode = filterContext.RouteData.Values["entityCode"] as string;
            // do your logic...         
            if (!allowed)
                filterContext.Result = new HttpUnauthorizedResult();            
        }
    }
    

    此外,如果 entityCode 不在您的RouteData中,您可以使用 filterContext.RequestContext.HttpContext.Request 查看日志数据。

    推荐文章