【发布时间】:2015-11-22 23:29:57
【问题描述】:
在我的项目中,我使用基于声明的授权和身份验证实现了 ASP.NET Identity 2.x。 我添加了对声明授权属性 as described here 的支持。
这是我提出的允许/禁止对员工进行 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();
}
我不太明白如何在视图及其视图模型中使用这些声明。 例如,有一个显示员工的视图,它是一个简单的网格。 然后是编辑和创建员工的视图。
视图和视图模型现在应该能够根据用户声明隐藏或显示保存/更新/删除按钮。
观点方法:
Index -> 如果存在 ReadEmployee 声明,则应该显示所有员工,否则视图应该仍然可以访问,但会显示“无查看员工的权限”消息。
创建/编辑 -> 用户应该仍然能够导航到这些视图,但“创建”/“保存”按钮应该不可见。
删除 -> 应隐藏所有“删除”按钮。
底线是,视图应该可以访问,但创建/保存按钮应该隐藏。
如何做到这一点?
* 更新/我的解决方案 *
这就是我最终做到的方式。 按照 Derek 的建议,我使用了基于操作/资源的身份验证。除了 ASP.NET Identity,我还实现了 IUserClaimStore 接口以从数据库中获取声明。
视图和视图模型 (!) 不包含 CanRead、CanWrite 之类的任何内容! 我正在使用 KendoUI,并为按钮创建了扩展方法。
在扩展方法中,我可以访问自定义 ResourceAuthorizationManager(参见 Dominik Baier 的博客)。所以在创建按钮时,我可以调用 HttpContaxtBase.CheckAccess(...) 来确定按钮是否应该启用/可见。
我唯一需要的就是告诉扩展方法要检查访问权限的操作/资源组合。
剃刀示例:
@Html.LinkButton(Action.Create, Resource.Employee)
这就是视图中显示(或不显示)“创建”按钮并指向员工控制器的创建视图所需的全部内容。 非常干净,恕我直言。
【问题讨论】:
标签: c# asp.net-mvc-5 asp.net-identity claims-based-identity asp.net-authorization