非RBAC用户角色和权限系统:检查用户的城市

时间:2010-05-15 10:45:34

标签: asp.net-membership rbac

我们目前在我们的网络应用程序(ASP.NET)中设计 用户角色和权限系统,似乎我们有几个案例 不适合在经典基于角色的访问控制(RBAC)中。我将发布几个问题,每个问题专门针对特定案例,这是第一篇文章。

我们有以下案例:如果用户居住在特定城市,则不允许用户查看特定页面。这是一个简单的案例,按以下方式编码:

if (User.City == “Moscow”)
// Allow the user to view the page.
else
// Do not allow the user to view this page.

虽然这种情况非常简单明了,但它与RBAC无关。

在StackOverflow上,有人将此称为基于属性的访问控制

在经典的RBAC下,似乎这个案例的设计应该是这样的:引入一个许可“人居住的城市”,这个权限将有一个属性City。然后创建一个角色,向其添加“City = Moscow”类型的权限,并将角色分配给用户。看起来非常繁琐

问题是否可以将这种非RBAC方法引入我们的权限系统 - 是否会破坏设计?

这似乎是一个原始问题,但我们发现大多数应用程序都使用纯RBAC,我们开始认为我们可能做错了。

谢谢。

1 个答案:

答案 0 :(得分:1)

对于基于属性的访问控制,这将是一个很好的案例。但是,如果您不介意查看PHP实现,Zend Framework有一个基于角色的访问控制,它使用断言来解决更多特殊情况:

http://framework.zend.com/manual/en/zend.acl.advanced.html

标准规则允许角色对资源执行操作。第四个参数允许规则仅在满足某些条件时应用。在伪代码中:

allow(member, view, page) // standard
allow(member, view, page, userLivesInMoscow) // assertion used

断言是一个传递给用户的对象。它有一个检查是否满足断言的方法:

interface Assertion
 bool public function assert()

class UserLivesIn implements Assertion
 public function UserLivesIn(User, City) ...
 // implementation of assert method comes here

这是实现所需内容的一种方式。