【问题标题】:ASP.NET: Permission/authentication architectureASP.NET:权限/身份验证架构
【发布时间】:2010-09-27 16:15:21
【问题描述】:
我正在考虑在我的 ASP.NET 应用程序中构建身份验证,并满足以下要求。
- 一个用户只有一个角色(即 Admin、SalesManager、Sales ......)
- 角色具有一组权限,可以 CRUD 访问现有对象的子集。 IE。
"Sales 对对象类型 "Products" 具有 CREAD、READ、WRITE 权限,但没有 DELETE"
- 不知何故,我喜欢将权限置于具有继承的层次结构中,这样我即管理员不需要指定所有可用对象。
- 系统必须能够快速回答“用户 X 是否有权对对象 Z 执行 Y”的问题
- 所有数据库托管 (MSSQL),在 C#/ASP.NET 中实现
我想获得有关这些要求的反馈?任何想法如何使用 ASP.NET 框架(尽可能)实现这一点? (不过,我也很想知道如何在没有会员资格的情况下实现这一目标)
【问题讨论】:
标签:
c#
asp.net
security
forms-authentication
【解决方案1】:
我会建立用户/角色关系,以便用户可以拥有多个角色。我看到了一对一的关系,我很紧张,因为我知道,即使我们现在没有看到需要它,总有一天有人会希望某人既是销售用户又是客户服务用户。
在我们的客户系统中,我们使用角色对诸如“delinquentCustomer”之类的内容进行分层。这样,原始权限仍然有效——只要他们支付账单。值得考虑这种方法。
【解决方案2】:
我认为我认为可以满足您的要求的最佳实现之一已记录在 here。唯一的问题是它与 NHibernate 挂钩,但您可以将其用作模板来创建自己的权限实现,并简单地挂钩到您自己的事件模型而不是 NHibernates 拦截器。
我自己正在开发这样一个系统,一旦我对它感到满意,就会在博客上发布它。
【解决方案3】:
我认为您需要在这里做的是在您的业务对象或控制器中实现一组权限查询方法。示例:CanRead()、CanEdit()、CanDelete()
页面呈现时,需要查询业务对象,确定用户授权的能力,并根据这些信息启用或禁用功能。反过来,业务对象可以使用角色或其他数据库查询来确定活动用户的权限。
我想不出一种以声明方式集中定义这些权限的方法。它们需要分发到功能的实现中。但是,如果您想改进设计,您可以使用依赖注入将授权者插入到您的业务对象中,从而保持实现分离。
Rocky Lhotka 的书中有一些代码使用了这个模型。 Google 中还没有新版本。
【解决方案5】:
从 ASP.NET 2.0 开始提供的会员 API 应该可以很好地满足您的要求。恐怕它唯一不直接支持的是分层角色。但是,您可以轻松地使用基于角色的正常安全性和另一个手动编写的分层角色表来实现所需的事情。