【问题标题】:Data-based authorization in ASP.NETASP.NET 中的基于数据的授权
【发布时间】:2011-04-06 07:08:14
【问题描述】:

总结:我需要根据 url 的查询字符串中存在的数据来授权页面,而不仅仅是页面名称。


背景:

假设我正在构建一个图书馆库存系统。可以以管理员或用户角色创建用户并将其分配给单个库。同一个数据库中有数百个相互竞争的图书馆,因此确保一个图书馆的用户无法查看另一个图书馆的库存是很重要的

现在我正在使用一个非常标准的 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) 更复杂的是,我仍然希望通过安全调整来检查用户是否对任何集合或库具有管理员权限,如果没有,则隐藏管理员页面。

【问题讨论】:

  • +1 将您的问题格式化得非常好!

标签: asp.net authorization


【解决方案1】:

我不会在 UI (ASP.NET) 层附近的任何地方处理此问题,而是在应用程序服务中处理。比如:

  1. 构建采用IPrincipal(或您的自定义用户对象)的服务 作为构造函数参数。
  2. 当请求书/评论/任何东西时,服务负责 用于查看用户是否有权访问 资源。
  3. 如果用户没有访问权限,请执行一些预定的操作(通过 消息,抛出异常,返回 null)。

从长远来看,这将更具可测试性和可用性,而不是从 ASP.NET UI 方面担心它。

如果您必须在 ASP.NET 端处理它,我会考虑使用自定义 IPrincipal 和自定义 RoleProvider 将每个库包装为要访问的角色,那么您可以使用大部分 @ 987654324@等控件。

【讨论】:

  • +1 这些都是非常好的观点。如果它抛出异常,而我忘记在 UI 中处理它,最坏的情况是它会崩溃而不是泄漏敏感数据(这是一件好事)。
【解决方案2】:

通常,这类事情是在数据级别处理的。它与 ASP.NET 几乎没有关系,除了最终您需要一个用户 ID(来自会员资格)。您要做的是找到您想要控制访问的实体的某些部分,然后创建所有查询以对其进行过滤。

例如,如果您在库级别进行访问,那么您将在用户和库之间添​​加关联。这可以是 1:1、1:many、many:many,无论您的数据模型需要什么。关键是通过这个级别加入将始终不返回任何记录,因此您的整个查询将不返回任何记录。

例如,假设一个用户只能属于一个图书馆。

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

这样,用户就不可能查询与他们没有直接关联的任何内容。安全性完全在数据库中,不需要任何业务逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2013-02-13
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多