2010-08-31 93 views
7

摘要:我需要根据url中查询字符串中存在的数据来授权页面,而不仅仅是页面名称。ASP.NET中基于数据的授权


背景:

比方说,我建立一个库库存系统。用户可以创建并分配给管理员或用户角色中的单个库。在同一个数据库中有数百个竞争库,因此确保一个库的用户无法查看来自其他库的库存是非常重要的。

现在我正在使用一个非常标准的ASP.NET设置:使用SqlMembershipProvider进行表单身份验证。使用SqlRoleProvider进行授权,通过web.config中的<authorization>部分进行配置。使用SiteMap提供程序进行安全修整以隐藏未经授权的页面。

要控制库存信息泄漏,我手动检查每个库存查询的用户的关联库ID。它可以工作,但它很乏味,容易出错。一定有更好的方法。

问:

现在,用户必须在库中创建任意“收藏”的能力。 (例如,集合A具有书籍1,2,& 3)。管理员希望能够授予对各个集合的管理员/用户访问权限,而不仅仅是整个库。

因此,如果用户转到www.com/Book.aspx?BookId=1,系统需要确保用户在显示页面之前拥有“Book 1”所在集合的权限。如果他们转到www.com/Reviews.aspx?ReviewId=23,我需要确保“审阅”适用于他们有权查看的集合中的图书。

1)我怎样才能以最标准的ASP.NET方式实现这一点?
在基本页面内手动检查?
自定义的HttpModule?
自定义角色提供程序?
我对如何存储管理员/用户权限不感兴趣,而是根据这些权限来确定如何/如何授权。 (关于如何执行任何这些例子都赞赏)

2)为了进一步复杂化,我还是想安全修整,以检查用户是否有任何集合或库管理权限和隐藏的管理员如果他没有的话。

+0

+1用于格式化您的问题如此令人难以置信的好! – user279521 2010-08-31 14:17:12

+0

@ user279521:谢谢:) – Greg 2010-08-31 14:17:52

回答

2

我不会在UI(ASP.NET)层附近的任何地方处理这个问题,而是在应用程序服务中。喜欢的东西:它采取IPrincipal(或您的自定义用户对象) 作为构造函数参数

  1. 构建服务。
  2. 当请求书籍/评论/无论如何,该服务是负责 用于检查,看看用户是否有权访问 资源。
  3. 如果用户没有访问权限,请执行一些预定义的操作(传递一个 消息,抛出异常,返回null)。

从长远来看,这将是更多的可测试和可用的,然后从ASP.NET UI端担心它。

如果你必须处理它在ASP.NET的一面,我会考虑使用自定义IPrincipal和定制RoleProvider到每个库包作为一个角色的访问,那么你可以使用大多数LoginView等。控制。

+0

+1这些都是非常好的一点。如果它抛出一个异常,我忘记在UI中处理它,最糟糕的是它会崩溃而不是泄露敏感数据(这是一件好事)。 – Greg 2010-08-31 14:20:18

1

通常情况下,这种事情是在数据层面处理的。它与ASP.NET无关,除了最终你需要一个用户id(来自Membership)。你所做的是找到你想要控制访问的实体的某个部分,然后创建所有查询来对其进行过滤。例如,如果您在库级别访问,那么您将在用户和库之间添​​加关联。无论您的数据模型需要什么,这可以是1:1,1:很多,很多:很多。关键是通过这个级别的连接将总是返回没有记录,因此你的整个查询将不返回任何记录。

例如,假设用户只能属于一个库。

用户表具有LibraryID,Books表具有LibraryID,这使用户和书籍之间有效的多对多连接。因此,您在LibraryID上加入User和Library,并在LibraryID上加入Library和Books,那么只有属于与用户关联的库的书籍才会被查询返回。

以这种方式,用户不可能查询他们没有直接关联的任何东西。安全性完全在数据库中,并且不需要业务逻辑。