【问题标题】:How to avoid duplication of authorization code logic如何避免授权码逻辑重复
【发布时间】:2011-02-23 11:40:42
【问题描述】:

我编写了一个从System.Web.Mvc.AuthorizeAttribute 派生的自定义授权属性。我在控制器中成功使用它来限制对某些功能的访问。

public class ArticleController : Controller
{
    [CustomAuthorize(Role.Administrator)]
    public ActionResult Delete(int id)
    {
       // ...
    }
}

而且效果很好。现在我想根据相同的授权逻辑显示或隐藏 HTML 元素。例如,在我的视图“文章”中,如果用户不是管理员,我想隐藏操作按钮“删除”。我写过类似的东西:

<ul id="menu">
   <li>@if (User.IsInRole(Role.Administrator)) { 
          @Html.ActionLink("Delete", "Delete", "Article", new { id = article.ID }, null)
       } </li>
</ul>

它也可以正常工作,但它会创建代码逻辑重复,因为我需要指定两次必要的凭据来执行操作:

  • 在控制器中阻止或允许操作。
  • 在视图中显示或隐藏操作链接。

避免这种重复的最佳方法是什么?有没有办法从视图中重用我的自定义授权属性?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 authorization


    【解决方案1】:

    自定义助手应该是最好的选择,例如:

    @Html.SecureActionLink("Delete", "Delete", "Article")
    

    此助手将检查某种服务,以查看当前用户/角色是否有权访问此链接。

    【讨论】:

      【解决方案2】:

      使菜单成为局部视图。

      【讨论】:

        【解决方案3】:

        我会为此创建自定义 html 帮助器。

        public MvcHtmlString AuthorizedActionLink(this HtmlHelper htmlHelper, 
        string actionName, ... , Role role)
        

        如果您觉得 Role 参数是多余的,您可以使用反射检查控制器操作并自动确定允许的角色。

        【讨论】:

          猜你喜欢
          • 2021-11-27
          • 2020-08-12
          • 2010-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-17
          • 1970-01-01
          相关资源
          最近更新 更多