ASP.NET中基于数据的授权

Gre*_*reg 7 asp.net authorization

简介:我需要根据URL的查询字符串中存在的数据来授权页面,而不仅仅是页面名称.


背景:

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

现在我正在使用一个非常标准的ASP.NET设置:使用SqlMembershipProvider进行表单身份验证.使用SqlRoleProvider进行授权,通过<authorization>web.config中的部分进行配置.使用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)为了进一步复杂化,我仍然希望安全修整来检查用户是否拥有任何集合或库的管理员权限,如果他没有,则隐藏管理页面.

Wya*_*ett 2

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

  1. 构建将IPrincipal(或您的自定义用户对象)作为构造函数参数的服务。
  2. 当请求书籍/评论/其他内容时,该服务负责检查用户是否有权访问该资源。
  3. 如果用户无权访问,则执行一些预定的操作(传递消息、抛出异常、返回 null)。

从长远来看,这将比从 ASP.NET UI 方面担心它更容易测试和使用。

如果您必须在 ASP.NET 端处理它,我会考虑使用自定义IPrincipal和自定义RoleProvider来将每个库包装为一个角色来访问,然后您可以使用大多数LoginView等控件。