【问题标题】:Authorization on data access in .net MVC.net MVC 中的数据访问授权
【发布时间】:2014-03-12 16:09:03
【问题描述】:
我有一个包含两个实体的应用程序:
public class Employer {
public string Title {get;set;}
public virtual ICollection<Application> Applications {get;set;}
}
public class Application {
public string Title {get;set;}
}
我想授予用户访问特定雇主的权限(一个雇主可以有多个用户),以便他们可以为其雇主提交申请。这也包括对“你的”雇主的看法。
为了解决这个问题,我想到了以下两种可能:
创建雇主时,也会创建相应的角色。然后可以将用户添加到该角色中,我将编写一些自定义逻辑来检查用户是否在相应的角色中。这里的难点在于,似乎很难以任何安全的方式将角色与雇主联系起来(无需编写我自己的角色提供者)
在 Employer 类中添加用户集合等属性,并检查当前登录的用户是否在此集合中,以确定用户是否具有访问权限。
这些是好的解决方案,还是有更好的方法来解决我的问题?
【问题讨论】:
标签:
.net
asp.net-mvc
authorization
asp.net-mvc-5
【解决方案1】:
这是 DAO(数据访问对象)的问题,目前没有使用实体框架(mvc 5 标准和 asp.net 身份)自动执行此操作的方法。
一些建议:
1) 它很容易创建或覆盖并使用您自己的规则的“RoleManager”和“UserManager”。
2) 您可以封装数据访问,使用代理或包装器之类的东西从实体框架中获取数据
唯一你肯定无法克服(如果你想使用的话)是“自定义映射”,我的意思是...... Employer 的集合属性总是会根据映射配置加载数据,并且映射配置有点受限(不支持自定义子句,比如关系中的 where)。
【解决方案2】:
我不会为此使用角色。角色通常用于控制对功能的访问,而不是数据子集(尽管有例外)。
现在,您可能会遇到这样的问题:您的员工受雇于不止一家公司,并且他们对每家公司拥有不同的权限。在这种情况下,默认角色提供者不足以胜任该工作。
但是,如果用户都具有相同的功能,但他们只能访问不同的数据子集,那么解决方案是根据公司过滤您的数据。例如,公司实体将有一个雇员集合。任何其他数据都将与公司相关联。然后,在显示或编辑数据时,一定要查询数据属于当前用户所在公司的条件。一般来说,最好在 sql(或 ef)查询本身而不是在应用程序的代码中执行此操作。