全部博文(141)
分类:
2011-09-29 11:51:14
前言:之前的一些文章谈了一些有关验证的问题,接下来的一些文章就说下授权以及代码访问安全的问题。
在ASP.NET应用程序中,授权就意味着允许访问资源,资源的形式有很多了:文件,数据库,图片等。授权的处理过程基本上是:创建用户或者用户组,然后为他们分配权限。在.NET Framework中,有很多的方式可以实现授权,如文件授权,URL授权以及自定义的授权。
下面我们就来谈下ASP.NET是如何控制访问受限资源的,本篇主要讲述下列问题:
1.基于角色的安全
2. 权限的映射:
3.权限对象Permission简介
本篇的代码不是很多,到了下篇实战篇中尽量给出更多的代码。
系列文章链接:
ASP.NET安全问题--ASP.NET安全架构--如何实现.NET安全
主体(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对象操作的权限来实现。我们就可以在特定的地方写下:
上面是以声明的方式写的,我们也可以用代码,以后讲述。
其中SecurityAction枚举定义了访问的类型,如拒绝Deny。
上面的声明可以在类级别,方法级别,以及程序集级别使用。这里只是简单的描述,大家知道就行了,具体的我们后面讲述。
PrincipalPermission
PrincipalPermission确保调用者的上下文具有与之相关联的被请求的Principal。这话有点绕,下面看个例子就明白了:
下面的代码确保:只运行名为"xiaoyang"的用户访问一个特定的方法:
将代码放在任何一个方法的声明的上面就行了。
今天就先写到这里,理论比较多。大家见谅!
下一篇就讲述ASP.NET中的授权问题。