在.NET MVC中包装对功能的访问的方法?

时间:2010-03-13 05:49:18

标签: asp.net-mvc security privileges

在.NET MVC应用程序中包装对功能的访问有哪些不同的解决方案?

例如,我有六个选项卡代表应用程序的不同区域,在区域1内,可以添加,编辑,上传等任何内容。

我需要一个中心的方式来说:

  1. 构建一些用户可以执行的字典
  2. 包装标签,按钮,链接等,验证用户是否可以访问此功能并进行适当的显示/隐藏。
  3. 我知道我可以通过操作过滤器和角色来限制对操作的访问,但是从UI开始呢?

    任何帮助将不胜感激。我相信我不是唯一一个需要这样做的人,谢谢!

1 个答案:

答案 0 :(得分:2)

首先,您还需要执行服务器端授权。任何人都可以冒充您的客户并直接致电您的控制器,绕过您的客户端授权。

但这就是我要做的事情:

创建AuthorizationService以集中存储此业务逻辑。它将有如下方法:

public bool CanEditSomeObject(Guid userId, Guid objectId)

在控制器(或控制器引用的其他服务)中使用此AuthorizationService构建ViewModel,其中包含视图所需的所有授权信息。

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Edit(Guid id)
    {
        bool currentUser = _userService.GetUser(User.Identity.Name);
        bool canEditSomeObject = _authenticationService.CanEditSomeObject(currentUser.Id, id);
        var viewModel = new SomeObjectViewModel {CanEditSomeObject = canEditSomeObject};
        return View(viewModel);
    }

强烈查看您的视图并根据模型修改HTML。您可以使用部分视图之类的东西来使其更清洁。但是,您只需隐藏,禁用或不包含当前用户无权访问的内容的HTML。

<%= if (Model.UserCanEdit) Html.RenderPartial("EditForm.ascx") %>

此外,如果您需要在客户端动态更改内容(例如,用户执行操作a,现在他们可以执行操作b),您可以使用JQuery来操作HTML。你甚至可以使用JQuery调用你的控制器来询问它是否有问题(见question),但我不确定是否有必要。