基于角色的方法访问

时间:2010-10-15 09:01:00

标签: c# .net security methods security-roles

我正在实现使用基于角色访问类中不同方法的系统。例如,要执行任何操作,我需要检查使用它的用户是否可以执行此操作。

我可以写每种方法:

if(User.IsInRole ...) {
} else {
return ... throw ... whatever
}

我在考虑自动执行此过程,例如通过向此方法添加属性或可能是其他任何解决方案?

3 个答案:

答案 0 :(得分:3)

只要您使用委托人,事情已经存在......

[PrincipalPermission(SecurityAction.Demand, Role = "A role available on your principal")]
public void Foo()
{
  // Will throw an exception if the principal does not have the required role
  // Otherwise the method will execute normally
}

答案 1 :(得分:1)

在构造时进行一次检查,如果不满足安全条件,则抛出(或从工厂返回NULL)。此后,保持对给定模型对象的引用足以证明您在某个早期点通过了安全检查。如果您担心这会导致TOCTTOU问题,请确保在应用程序定义的“游戏转向”概念(通常是数据库事务)结束时这些对象变得不可用;无论如何,这是一个很好的做法。

这种安全方法称为capability discipline。将您的对象视为具有some authority inside them(在其私有变量中)的框。通过按下框上的按钮,您只能以对象的程序员允许的方式对该权限进行定制下调。

例如,假设您正在编写带有SQL后端的日历应用程序。有SQLTransaction对象,它不会超过事务(如上所述),但仍具有应用程序使用的所有表的所有权限。这是你不希望传递给API用户的很多权力(明确地或错误地,想想SQL注入)。相反,您分发User对象,这些对象模拟权限,只写入Users表中该用户的行; User也可以创建,读取,更新,删除Appointment个对象,这些对象同样代表约会表中的有限权限。

要在整个API中维护RBAC,您必须确保以下保留:

  1. 只有合法用户才能访问代表它们的User对象。您可以将身份验证系统连接到User构造函数;
  2. User个对象不leak authority,即您必须审核您的API,以确保通过对User(或递归返回的任何相关对象)执行方法调用您无法读取或更改任何不属于此用户的资源。您可以在此处应用facet模式 - 例如User.GetAppointments()返回真实Appointment实例,以便为此用户创建约会,但为其他人创建的约会包含只读包装。

答案 2 :(得分:0)

查看“面向方面编程”(AOP)库 - 以及this StackOverflow question的答案。 您可以使用AOP自动添加角色检查代码。

相关问题