ASP.NET:权限/身份validation体系结构
我正在考虑在我的ASP.NET应用程序中构建一个具有以下要求的身份validation 。
- 用户只有一个角色(即Admin,SalesManager,Sales,….)
- 角色具有一组CRUD访问现有对象子集的权限。 即“Sales对对象类型”产品具有CREAD,READ,WRITE权限“但不是DELETE”
- 不知怎的,我喜欢在具有inheritance的层次结构中的权限,因此我对于管理员不需要指定所有可用对象。
- 系统必须能够快速回答“用户X是否有权对Y进行对象Z”的问题
- 所有数据库管理(MSSQL),在C#/ ASP.NET中实现
我想获得有关这些要求的反馈意见吗? 任何想法如何使用ASP.NET框架(尽可能)实现这一点? (但是,我也有兴趣知道如果没有会员资格可以实现这一目标)
我认为你需要做的是在业务对象或控制器中实现一组权限查询方法。 示例:CanRead(),CanEdit(),CanDelete()
当页面呈现时,它需要查询业务对象并确定用户授权的function,并根据此信息启用或禁用function。 反过来,业务对象可以使用角色或其他数据库查询来确定活动用户的权限。
我想不出一种集中声明性地定义这些权限的方法。 它们需要分配到函数的实现中。 但是,如果要改进设计,可以使用依赖项注入将授权程序插入到业务对象中,从而使实现保持独立。
在Rocky Lhotka的书中有一些代码使用了这个模型。 新版本尚未在Google中使用 。
我认为这里有一个我认为能满足您要求的最佳实现。 唯一的问题是,它挂钩到NHibernate,但你可以使用它作为模板来创建自己的权限实现,并简单地挂钩到你自己的事件模型而不是NHibernates拦截器。
我自己正在研究这样一个系统,一旦我对它感到满意就会写博客。
自ASP.NET 2.0以来提供的成员资格API应该很好地满足您的要求。 我唯一害怕它不直接支持的是分层角色。 但是,您可以轻松地使用基于角色的常规安全性与另一个手动编写的分层角色表来实现所需的function。
您可以在此处阅读如何设置ASP.NET成员身份: http : //msdn.microsoft.com/en-us/library/yh26yfzy.aspx
它允许您将文件夹/页面等分组到组/用户。 我想你会发现这足够了!
通过扩展生成的数据库和过程,可以轻松管理无政府状态。
我将构建用户/角色关系,以便用户可以拥有多个角色。 我看到1-1的关系,我感到紧张,因为我知道,即使我们现在看不到它的需要,有人有一天会想要有人同时成为销售用户和客户服务用户。
在我们的客户系统中,我们使用角色来分层“delinquentCustomer”之类的东西。 这样,原始权限仍然有效 – 只要他们支付账单。 值得考虑这种方法。