在我的项目中,我使用基于声明的授权和身份验证实现了 ASP.NET Identity 2.x。我添加了对声明授权属性的支持,如此处所述。
以下是我提出的允许/禁止对员工进行 CRUD 的声明。
public class ResourceClaimTypes
{
public const string CreateEmployee = "urn:company:Employee:Create";
public const string ReadEmployee = "urn:company:Employee:Read";
public const string UpdateEmployee = "urn:company:Employee:Update";
public const string DeleteEmployee = "urn:company:Employee:Delete";
}
一个动作看起来像这样:
[ClaimsAuthorize( ResourceClaimTypes.ReadEmployee )]
public ActionResult Index()
{
return View();
}
我不太明白的是如何在视图及其视图模型中使用这些声明。例如,有一个显示员工的视图,它是一个简单的网格。然后是用于编辑和创建员工的视图。
视图和视图模型现在应该能够根据用户的声明隐藏或显示保存/更新/删除按钮。
意见的方法:
如果存在 ReadEmployee 声明,则索引 ->应显示所有员工,否则该视图仍应可访问,但会显示消息“无查看员工的权限”。
创建/编辑 ->用户应该仍然能够导航到这些视图,但“创建”/“保存”按钮不应该是可见的。
删除 ->应隐藏所有“删除”按钮。
底线是,视图应该是可访问的,但创建/保存按钮应该被隐藏。
怎么可能呢?
*更新/我的解决方案*
这就是我最终做到的方式。按照 Derek 的建议,我使用了基于操作/资源的身份验证。除了 ASP.NET Identity,我还实现了 IUserClaimStore 接口以从数据库中获取声明。
视图和视图模型 (!) 不包含 CanRead、CanWrite 之类的任何内容! 我正在使用 KendoUI 并为按钮创建了一个扩展方法。
在扩展方法中,我可以访问自定义 ResourceAuthorizationManager(参见 Dominik Baier 的博客)。所以在创建按钮时,我可以调用 HttpContaxtBase.CheckAccess(...) 来确定按钮是否应该启用/可见。
我唯一需要的是一种方法来告诉扩展方法要检查访问的操作/资源组合。
剃刀示例:
@Html.LinkButton(Action.Create, Resource.Employee)
这就是视图中显示(或不显示)“创建”按钮并指向员工控制器的创建视图所需的全部内容。很干净,恕我直言。