基于ASP.NET的授权

简介 :我需要基于url的查询字符串中存在的数据授权页面,而不仅仅是页面名称。


背景:

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

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


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

  • 构建将IPrincipal (或您的自定义用户对象)作为构造参数的服务。
  • 当请求书籍/评论/任何时候,该服务负责检查以查看用户是否有权访问该资源。
  • 如果用户没有访问权限,请执行一些预定义的操作(传递消息,抛出异常,返回null)。
  • 从长远来看,这将是更多的可测试和可用的,然后从ASP.NET UI端担心它。

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


    通常情况下,这种事情是在数据层面处理的。 它与ASP.NET无关,除了最终你需要一个用户id(来自Membership)。 你所做的是找到你想要控制访问的实体的某个部分,然后创建所有查询来对其进行过滤。

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

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

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

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

    链接地址: http://www.djcxy.com/p/2595.html

    上一篇: based authorization in ASP.NET

    下一篇: template parameters, #define and code duplication