【问题标题】:How to handle complex authorization in an ASP.NET MVC 4 / EF application?如何处理 ASP.NET MVC 4 / EF 应用程序中的复杂授权?
【发布时间】:2013-10-01 12:55:26
【问题描述】:
在我的应用程序中添加、更新和删除各种实体的能力通常取决于所涉及的各种用户之间定义的关系。这是一个例子:
- 基本用户或其主管可以创建与用户关联的任务,但只有他的主管可以锁定任务,这样基本用户将无法再添加/更新/删除它。在锁定之前,两个人都可以更新任务。
什么是实现这类复杂和高级规则的最佳方法,这些规则处理用户关系和实体状态(新的、现有的),以及其他可能关联的用户定义的状态实体?
谢谢
【问题讨论】:
标签:
asp.net
entity-framework
asp.net-mvc-4
entity-framework-4
authorization
【解决方案1】:
什么是实现这类复杂和高级规则的最佳方法,这些规则处理用户关系和实体状态(新的、现有的),以及其他可能关联的用户定义的状态实体?
您想使用授权标准,即 XACML,即可扩展访问控制标记语言。 XACML 是:
- OASIS 开发的标准,就像 SAML 一样
- 专注于细粒度访问控制的标准:考虑用户信息、资源信息、状态和上下文信息的访问控制
- 一种实现基于属性的访问控制 (ABAC) 模型的标准:用户信息、资源数据和状态都可以视为属性
- 一种使用策略和规则来构建属性并授予/拒绝访问权限的标准:XACML 是基于策略的
- 可以跨多个层应用的标准,例如跨越 MVC 应用程序的表示层、数据层和业务层
- 可应用于多种技术和语言的标准,例如C#(MVC4 及更多)、Java、Python...
使用 XACML,您可以轻松实现关系,例如:当且仅当交易金额 。
从这里到哪里去?
【解决方案2】:
在我工作的一家银行,我们有一个贷款管理系统,允许整个银行层级在其报告结构中查看贷款。例如,市场主管可以一次查看他/她所有报告的贷款组合。此外,她/他可以从所有报告(直接或间接)名称的列表中进行选择,以查看该员工的投资组合。
这很复杂,但我们必须维护一个报告结构的 HR 数据库。一旦我们有了这个,我们就构建了用户函数(也可以作为存储过程完成,但用户函数在我们的 LINQ to SQL 后端运行良好)允许我们检查用户 x 是否监督用户 y。
因此,在您的示例中,只要您知道谁拥有任务,并且可以访问可用于确定任务所有者是否向当前登录用户报告的方法,您就应该能够轻松启用/禁用页面上的“锁定”按钮。
工作在于创建该报告结构数据库,并使其保持最新!