ASP.NET安全问题--ASP.NET中的授权问题(前篇)

                              ASP.NET安全问题--ASP.NET中的授权问题(前篇)


       前言:之前的一些文章谈了一些有关验证的问题,接下来的一些文章就说下授权以及代码访问安全的问题。
 
       在ASP.NET应用程序中,授权就意味着允许访问资源,资源的形式有很多了:文件,数据库,图片等。授权的处理过程基本上是:创建用户或者用户组,然后为他们分配权限。在.NET Framework中,有很多的方式可以实现授权,如文件授权,URL授权以及自定义的授权。

       下面我们就来谈下ASP.NET是如何控制访问受限资源的,本篇主要讲述下列问题:
       1.基于角色的安全
       2. 权限的映射:
       3.权限对象Permission简介

       本篇的代码不是很多,到了下篇实战篇中尽量给出更多的代码。
 

系列文章链接:

ASP.NET开发安全问题

ASP.NET安全问题-- 创建安全的Web应用程序

ASP.NET安全问题--ASP.NET安全架构

ASP.NET安全问题--ASP.NET安全架构--如何实现.NET安全

ASP.NET安全问题--ASP.NET生命周期中的验证以及身份验证模块

ASP.NET安全问题--Forms验证的具体介绍(上篇)

ASP.NET安全问题--Froms验证的具体介绍(中篇)

ASP.NET安全问题--Forms验证(后篇)--实战篇

ASP.NET安全问题--ASP.NET中的授权问题(前篇)


       1.基于角色的安全
       相信大家多什么是角色的,以及基于角色的安全都有一些了解,他们的概念就不赘述了。在讲述基于角色的安全之前,希望大家对之前讲过的Identity和IPrincipal要了解(如果不是很清楚的,可以参看我之前的安全的系列文章)。
 
       在.NET中,可以用.NET Framework灵活的将用户标识(Identity)和角色相结合,并且为结合后的主体定义权限。我们之前说过:


       主体(IPrincipal)=(用户标识:包含用户名等信息的对象)Identity+角色;
 
       我们可以定义很多的角色,然后为角色定义访问资源的权限。我们一般是定义角色,如定义一个Customer角色,然后使用户的角色为Customer,然后我们定义Customer的访问权限,那么这些访问的权限就应用到了那些角色为Customer的用户上,也就是说,我们并不是为每个用户分别定义权限,因为那样维护和修改起来麻烦。

       当然,我们也可以对特定的用户单独的进行授权,如写入文件。授权的方式很多,但是他们的思想是大体相同的:

        通常,一个应用程序的授权步骤如下:

       1.判断用户是否有合法的访问资源的凭证(也就是我们之前谈论的验证的过程)
       2.拒绝特定的用户访问特定的资源
       3.允许特定的用户访问特定的资源

       2. 权限的映射:

       在.NET 中,有一些内置的Permission对象,它们可以使得用户有合适的权限来访问资源。在讲后面的问题之前,首先说说什么是Permission。我们知道,我们的系统中一般有很多的文件和文件夹,而且这些文件或者文件夹常常都是有访问的权限的,比如,我们可以把一些文件的权限定义为:只能管理员修改,一般的用户只读,这点大家都不陌生了。


       注意:我们是通过系统来配置这些文件或者文件夹的权限的。(大家应该都会)

       我们的网站,实质其实就是放在服务器上的一些文件,既然这些文件在服务器,如Win Server 2003上,那么这些文件肯定是有访问的权限的。如果你是这台服务器的管理员,那么你就可以对这些文件进行任意的操作,其他的用户就没有这个能力了。

       现在我们假设,我们的网站是放在服务器上,而且网站的文件,如aspx页面,图片,App_Code等都在网站的文件夹中,而且这些文件资源的权限早就定义好了,如只读。
 
       其实我们在.NET中的一些Permission类,其实就是权限的映射。怎么说?

       假如我们的网站文件夹中的一个文件,如Admin.aspx页面,我们可以通过操作系统来定义这个文件的访问权限(操作为:选中文件,点击右键,选择"共享和安全",然后选择哪些用户可以访问,而且这些用户的操作是什么,如读,写,安全控制等)。这些都是系统定义的一些权限,.NET Framework就把定义在文件上的一些权限"取出",包装映射在一些Permission类中,这样我们就能用托管代码,如C#来操作这些权限,而不用Win API(非托管代码)来操作。(理解如有问题,欢迎大家指正!)

 

        3.权限对象Permission简介
       下面我们就举一些Permission类的例子.
       FileIOPermission
       PrincipalPermission
 
       这些内置的权限对象都会保护指定的资源。如FileIOPermission对象将确保只允许授权的用户访问一个文件。即,FileIOPermission对象将当前用户的凭证映射在操作系统级别,映射的结果就是该用户和系统中已存在的某一用户的操作权限相同(如IUser),那么现在这个用户就可以设置文件的权限。
 

      FileIOPermission
      FileIOPermission对象要求用户是Windows用户,或者ASP.NET处理过程运行在一个特定的标识下(一般是ASPNET用户账户),并且根据为文件系统中的文件或者文件夹定义的权限,授予读或者写的权限。即,FileIOPermission对象在文件系统中定义的权限上下文中验证Principal.

       例如,在ASP.NET程序中,我们可能想要在点击按钮之后写入一个文件,那么,文件就应该配置必需的访问权限,并且为登录到应用程序的用户授予必需的权限。
 
       如果想要拒绝访问一个特定的文件夹,如C:\Windows,那么我们就可以通过在运行阶段拒绝对FileIOPermission对象操作的权限来实现。我们就可以在特定的地方写下:

[FileIOPermissionAttribute("SecurityAction.Deny,All="C:\\Windows")]

 

 

       上面是以声明的方式写的,我们也可以用代码,以后讲述。
 
       其中SecurityAction枚举定义了访问的类型,如拒绝Deny。

       上面的声明可以在类级别,方法级别,以及程序集级别使用。这里只是简单的描述,大家知道就行了,具体的我们后面讲述。
 
 
       PrincipalPermission
       PrincipalPermission确保调用者的上下文具有与之相关联的被请求的Principal。这话有点绕,下面看个例子就明白了:


       下面的代码确保:只运行名为"xiaoyang"的用户访问一个特定的方法:
      

 [PrincipalPermission(SecurityAction.Demand,Name="localhost\\xiaoyang"]

 

 

       将代码放在任何一个方法的声明的上面就行了。


       今天就先写到这里,理论比较多。大家见谅!
       下一篇就讲述ASP.NET中的授权问题。

      

 

 


 

posted @ 2009-06-19 15:28 小洋(燕洋天) 阅读(...) 评论(...) 编辑 收藏