基于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
(或您的自定义用户对象)作为构造参数的服务。 从长远来看,这将是更多的可测试和可用的,然后从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