代码之家  ›  专栏  ›  技术社区  ›  Greg

ASP.NET中基于数据的授权

  •  7
  • Greg  · 技术社区  · 15 年前

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


    背景:

    假设我正在建立一个图书馆库存系统。用户可以以管理员或用户角色创建并分配给单个库。同一个数据库中有数百个相互竞争的库,因此 必须确保一个库的用户不能查看另一个库的库存。 .

    现在,我正在使用一个相当标准的ASP.NET设置:使用sqlMembershipProvider进行表单身份验证。使用sqlRoleProvider进行授权,通过配置 <authorization> web.config中的节。使用站点地图提供程序进行安全修整,以隐藏未经授权的页面。

    为了控制库存信息的泄漏,我将在每个库存查询中手动检查用户的关联库ID。它是有效的,但它是乏味的,容易出错。必须有更好的方法。

    问题:

    现在,用户可以在库中创建任意“集合”。(例如,集合A中包含图书1、2和3。)管理员希望能够授予管理员/用户对单个集合的访问权限,而不仅仅是对整个库的访问权限。

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

    1)如何以最标准的ASP.NET方式实现这一点?
    在基本页内手动检查?
    自定义httpmodule?
    自定义角色提供程序?
    我对如何存储管理员/用户权限不感兴趣,而是对如何/在何处基于这些权限进行授权感兴趣。 (感谢有关如何实施其中任何一项的示例)

    2)更复杂的是,我仍然希望安全修整,以检查用户是否对任何集合或库具有管理权限,如果不具有,则隐藏管理页面。

    2 回复  |  直到 13 年前
        1
  •  2
  •   Patrick D'Souza ob1    13 年前

    我不会在靠近UI(ASP.NET)层的任何地方处理这个问题,而是在应用程序服务中处理。类似:

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

    从长远来看,这将更具可测试性和可用性,然后从ASP.NET用户界面方面考虑这一点。

    如果必须在ASP.NET端处理它,我将考虑使用自定义 委托人 习俗 RoleProvider 要将每个库包装为要访问的角色,则可以使用 LoginView 等控制。

        2
  •  1
  •   Erik Funkenbusch    13 年前

    通常,这类事情是在数据级别处理的。它与ASP.NET没有什么关系,除了Ultimate,您需要一个用户ID(来自成员资格)。您要做的是找到您想要控制访问权限的实体的某个部分,然后创建所有查询来筛选该部分。

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

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

    用户表有libraryid,图书表有libraryid,这使得用户和图书之间的有效多对多联接。因此,您在libraryid上加入用户和库,并在libraryid上加入库和图书,那么查询将只返回属于用户关联的库的图书。

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

    推荐文章