在 .NET MVC 应用程序中封装对功能的访问有哪些不同的解决方案?
例如,我有六个选项卡,代表应用程序的不同区域,在区域 1 内,可以添加、编辑、上传等等。
我需要一个中心的方式说:
- 建立一些用户可以做什么的字典
- 包装选项卡、按钮、链接等,验证用户可以访问该功能并适当地显示/隐藏。
我知道我可以通过操作过滤器和角色限制对操作的访问,但是从 UI 中呢?
任何帮助,将不胜感激。我相信我不是唯一需要这样做的人,谢谢!
在 .NET MVC 应用程序中封装对功能的访问有哪些不同的解决方案?
例如,我有六个选项卡,代表应用程序的不同区域,在区域 1 内,可以添加、编辑、上传等等。
我需要一个中心的方式说:
我知道我可以通过操作过滤器和角色限制对操作的访问,但是从 UI 中呢?
任何帮助,将不胜感激。我相信我不是唯一需要这样做的人,谢谢!
首先,您还需要执行服务器端授权。任何人都可以冒充您的客户并直接呼叫您的控制器,从而绕过您的客户端授权。
但这是我要做的:
创建一个 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 调用您的控制器向其提问(请参阅此问题),但我不确定这是否有必要。