`
yizhyi
  • 浏览: 59297 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

.NET框架中基于角色的安全性

    博客分类:
  • .net
阅读更多
 

概述<o:p></o:p>

<o:p> </o:p>

在过去的相当长一段时间内,计算机及信息犯罪的比例正在逐渐升高。美国联邦调查局的计算机安全组织在2001年的研究调查中发现85%企业的企业安全受到侵害。在对这些企业进行调查之后提出的财物损失报告中指出,合计损失为3亿77百万美元,比起2000年的2亿65百万美金增加了42%。由此可清楚的看出,计算机及信息犯罪的发生次数越来越频繁,其所造成的损失也越来越大,另外,犯罪的手段也越来越丰富,令企业安全人员防不胜防。因此企业必须有所行动来保护有价值的信息资产。自然而然的,安全性在现在的程序开发中越来越成为一个不可忽视的问题。<o:p></o:p>

<o:p> </o:p>

传统的安全模型将安全性建立在用户以及用户组的机制上来提供隔离和访问控制。这就意味着用户要么可以运行全部代码,要么都不能运行。而这正是现在大多数操作系统采取的安全模型,即使现在看来这种机制也是很有效的,但是深入思考之后我们可以发现这种机制存在的假设是所有的代码都具有相同的信任程度。当所有的代码都是来自你或者你的系统管理员,那么这种假设是行之有效的。但是现在大多数计算机都连上了Internet之后,这种"都行"或者"都不行"的方式就不那么好了。.NET框架提供了全面的安全系统,足以应付现在已有的大多数安全性问题。在.NET框架中提供了与传统模型相似的,但却是由开发人员自定义的安全模型,称为基于角色的安全性(Role-Based Security)。基于角色的安全性最重要的概念就是授权(Principals)和标识(Identity)。<o:p></o:p>

<o:p> </o:p>

基于角色的安全性<o:p></o:p>

<o:p> </o:p>

简单的说,程序安全性的目的就是防止不怀好意的人或者程序不能做管理员和开发人员不允许做的事情。在前面提到的传统的安全机制着眼于控制用户的权限,通过验证用户的身份标识来限制用户的操作,从而可以控制特定的用户对资源的访问,在过去很长的一段时间里,WindowsUNIX这两个最成功的操作系统都采取了这种安全机制。在讨论.NET的安全编程之前,我们将先来看看.NET平台提供的安全模型,只有深入理解安全模型,我们才能更加有效的利用平台给我们提供的更好的安全性保证(以下讨论的操作系统以Windows 2000Windows XP为主)。<o:p></o:p>

<o:p> </o:p>

.NET的安全模型在系统的安全模型的上层,并且与一些服务器程序的安全特性结合的很好(当然,目前这些产品还仅限于微软自己的产品,比如SQL ServerInternet Information Services IIS))。正因为.NET与操作系统的层次不同,所以.NET程序的安全性就取决于这样几个因素:.NET安全性是如何配置的,程序组件是怎样编写的,以及一些由Windows,网络设置或者其他程序设定的安全特性。<o:p></o:p>

<o:p> </o:p>

下面这幅图说明了.NET安全模型是如何在Windows的安全子系统上工作的。管理员使用管理控制台snap-ins设置用户帐号并制定安全策略。同时,管理员也负责管理.NET安全配置。当用户登陆操作系统并运行.NET托管程序,CLR将验证用户并允许程序进行某些动作,接着将这些操作传递给操作系统的安全监视程序。

 

 

不过有一个需要特别注意的问题,就是无论你怎样使用.NET的安全,资源仍然是处于操作系统级的保护之下。对于受特殊保护的资源,.NET平台的安全权限是无能为力的(其实这一点也正好符合.NET与操作系统的层次关系)。<o:p></o:p>

<o:p> </o:p>

下面我们就来详细的看看基于角色的安全性中的几个概念,以及这几个概念在.NET中是如何运用的。<o:p></o:p>

<o:p> </o:p>

验证(authentication)指的是确定用户身份的过程,而授权(authorization)指的是经过上面的过程之后给予用户访问特定资源的权限,说明白一点,验证就是知道"你是谁",而授权则是"让你可以做什么".NET为实现这两个过程提供了PrincipalIdentity对象,其中,基于角色的安全性基础建立在Principal对象之上,该对象封装了当前用户的信息,既包含用户身份,也包含他所扮演的角色;用户身份用Identity对象来指明,Identity对象中不仅包含指定的用户身份信息(用户名称或账号),还包括了"如何验证这一身份"的方法。<o:p></o:p>

<o:p> </o:p>

Identity对象<o:p></o:p>

<o:p> </o:p>

Identity对象是实现了IIdentity接口的类的实例。IIdentity接口包括三个只读属性:<o:p></o:p>

<o:p> </o:p>

string AuthenticationType {get;} 获取所使用的身份验证的类型<o:p></o:p>

<o:p> </o:p>

bool IsAuthenticated {get;} 获取布尔值,该值指出登陆用户是否经过验证<o:p></o:p>

<o:p> </o:p>

string Name {get;} 获取当前用户的名称<o:p></o:p>

<o:p> </o:p>

.NET中实现了接口的有以下四个类:<o:p></o:p>

<o:p> </o:p>

1GenericIdentity 用来表示一般性的用户,可以用于自定义登陆验证的情况。<o:p></o:p>

<o:p> </o:p>

2WindowsIdentity 用来表示登陆Windows系统成功的普通Windows用户。<o:p></o:p>

<o:p> </o:p>

3FormsIdentity 用来表示ASP.NET应用程序中使用Forms身份验证的用户。<o:p></o:p>

<o:p> </o:p>

4PassportIdentity 用来表示在使用Passport的应用程序中的用户。不过要注意必须要安装了Passport SDK才能使用这个类。<o:p></o:p>

<o:p> </o:p>

因为在当前的具体开发中使用得最多的是前三个,而FormsIdentity类将在后文专门讲到,所以下面我们将详细讨论前两个类<o:p></o:p>

<o:p> </o:p>

GenericIdentity<o:p></o:p>

<o:p> </o:p>

GenericIdentity类其实相当简单,它并不与任何特定的验证协议相关联。因此,它往往被用在采用了自定义登陆机制的场合。比如一个程序可以自己提示用户输入用户名和密码,然后到自定义的用户数据库中去查询。如果用户名和密码有效,那么程序就会创建一个基于数据库中的匹配记录的principal和(对应的)identity对象。<o:p></o:p>

<o:p> </o:p>

GenericIdentity类除了三个IIdentity接口定义的属性之外没有更多的东西了。不过,GenericIdentity类提供了两个构造函数。一个构造函数接受一个字符串参数,该参数指定的是用户名;另一个构造函数接受两个参数:第一个是用户名字符串,第二个是给定的验证类型字符串。<o:p></o:p>

<o:p> </o:p>

public GenericIdentity(string name);<o:p></o:p>

public GenericIdentity(string name, string type);<o:p></o:p>

<o:p> </o:p>

现在我们不过多地讲述使用GenericIdentity类的细节问题,在后面我们将会看到在一个实际的程序当中是如何使用GenericIdentity对象的。<o:p></o:p>

<o:p> </o:p>

WindowsIdentity<o:p></o:p>

<o:p> </o:p>

作为实现了IIdentity接口的派生类,WindowsIdentity类主要用于表示登陆Windows成功的用户。下面我们依次来看看WindowsIdentity类的构造函数,属性和方法。<o:p></o:p>

<o:p> </o:p>

在构造函数中会用到IntPtr类型的参数,我们先来看看这种数据类型,IntPtr类型通常用来表示与平台相关的数据类型,比如一个内存指针或者是一个句柄。在我们使用的情况下,IntPtr参数通常用来代表一个Win32句柄,而这个句柄指向的是一个32位的用户的帐号标记(account token)。这个标记一般是通过调用非托管的Win32 API获得的。<o:p></o:p>

<o:p> </o:p>

public WindowsIdentity(IntPtr userToken);<o:p></o:p>

public WindowsIdentity(IntPtr userToken, string authType);<o:p></o:p>

public WindowsIdentity(IntPtr userToken, string authType, WindowsAccountType acctType);<o:p></o:p>

public WindowsIdentity(IntPtr userToken, string authType, WindowsAccountType acctType, bool isAuthenticated);<o:p></o:p>

<o:p> </o:p>

每一个构造函数都带有相同的IntPtr参数,后面跟着一些带有其他信息的参数:验证类型,Windows帐号类型以及验证状态。要注意WindowsAccountType参数必须要使用下列枚举值之一:AnonymousGuestNormalSystem<o:p></o:p>

<o:p> </o:p>

理所当然的,WindowsIdentity类也具有IIdentity接口的三个只读属性: AuthenticationTypeIsAuthenticatedName。另外,WindowsIdentity类还有自身特有的属性:IsAnonymousIsGuestIsSystem,有了这三个属性可以更好的确定用户帐号。<o:p></o:p>

<o:p> </o:p>

接着再来看看WindowsIdentity类的方法。除了继承于Object类的方法之外,WindowsIdentity类还有这样三个方法:GetAnonymousGetCurrentImpersonate<o:p></o:p>

<o:p> </o:p>

1GetAnonymous方法返回的是一个表示匿名用户的WindowsIdentity对象。<o:p></o:p>

<o:p> </o:p>

2GetCurrent方法返回的是一个表示当前用户的WindowsIdentity对象。<o:p></o:p>

<o:p> </o:p>

3Impersonate方法可以让你的代码临时模拟出一个用户。<o:p></o:p>

<o:p> </o:p>

GetAnonymousGetCurrent方法都返回一个WindowsIdentity对象,使用也很简单,我们需要注意的是Impersonate方法,该方法有两个版本:实例版本(instance version)和静态版本(static version)。实例版本的方法不带参数,返回一个基于被调用WindowsIdentity对象的WindowsImpersonationContext对象(WindowsImpersonationContext类表示模拟操作之前的 Windows 用户);静态版本则需要一个IntPtr参数。这种模拟操作对于服务器程序来说是很有用的,它可以降低客户端访问服务器所用用户帐号的权限,从而在一定程度上提高了安全性。下面是上述方法的具体语法:<o:p></o:p>

<o:p> </o:p>

public static WindowsIdentity GetAnonymous();<o:p></o:p>

public static WindowsIdentity GetCurrent();<o:p></o:p>

public virtual WindowsImpersonationContext Impersonate();<o:p></o:p>

public static WindowsImpersonationContext Impersonate(IntPtr userToken);<o:p></o:p>

<o:p> </o:p>

Principal对象<o:p></o:p>

<o:p> </o:p>

Principal对象是实现了IPrincipal接口的类的实例,这些对象用来表示用户,并且包括了用户的身份信息。System.Security.Principal命名空间包括了几种类型的Principal类,这些类中封装了程序代码运行的的安全环境(security context)。我们在后面将会看到对用户名和角色进行检查以确定根据用户身份和角色资格是否可以让用户执行某些特定操作的示例代码。<o:p></o:p>

<o:p> </o:p>

对于每一个线程来说都与一个principal对象相关联。这个principal对象包括了表示运行当前线程的用户的identity对象。我们可以利用Thread类的静态属性CurrentPrincipal来获得这个principal对象。<o:p></o:p>

<o:p> </o:p>

下面我们来看看IPrincipal接口,该接口只有一个Identity公共属性和IsInRole公共方法:<o:p></o:p>

<o:p> </o:p>

1Identity属性指向一个与principal 对象关联的IIdentity对象。<o:p></o:p>

<o:p> </o:p>

2IsInRole方法需要一个字符串参数,该字符串是一个角色的名称,并且返回布尔值,指出principal对象是否属于指定的角色。<o:p></o:p>

<o:p> </o:p>

由于实际开发的需要,我们更多接触到的是WindowsPrincipal类,下面将详细讨论WindowsPrincipal类,相对而言,GenericPrincipal类就要简略一些了。<o:p></o:p>

<o:p> </o:p>

GenericPrincipal<o:p></o:p>

<o:p> </o:p>

GenericPrincipal类用来表示一个通过自定义验证的用户,通常与GenericIdentity类一起使用。下面是一段简单的程序,说明了这两个类如何使用:<o:p></o:p>

<o:p> </o:p>

//创建一个GenericIdentity对象<o:p></o:p>

<o:p> </o:p>

IIdentity myGenericIdentity = new GenericIdentity(strUserName, "MyAuthenticationType");<o:p></o:p>

<o:p> </o:p>

//创建一个GenericPrincipal对象<o:p></o:p>

<o:p> </o:p>

分享到:
评论

相关推荐

    asp.net知识库

    .Net框架下的XSLT转换技术简介 一个XSLT的简单例子 XSLXSLT板主题整理 xsl入门的好文章 新手学习XSL的好东西 XSL语法介绍 XSL学习心得 - 调用属性值 XSLT与XML转换的详细介绍 功能应用 读写搜索 基础教程 RSS Web2.0...

    ASP.NET基于Web的招投标系统的设计与实现(源代码+论文).rar

    该系统采用先进的ASP.NET技术构建,利用了.NET框架的强大功能和Visual Studio的开发效率。系统实现了用户注册、登录、发布招标信息、投标、评标、定标等核心功能,并支持多种角色的用户参与,包括招标方、投标方和...

    ASP.net入门教程

    ASP.NET 网站安全性 使用成员资格管理用户 使用角色管理授权 Forms 身份验证提供程序 ASP.NET 始终使用特定的 Windows 标识运行,因此,您可以通过使用 Windows 功能(例如 NTFS 访问控制列表 (ACL)、数据库...

    计算机专业毕设精选-ASP.NET基于BS课件发布系统(源代码+论文).rar

    1. **用户角色管理**:系统内置了管理员、教师和学生三种角色,每种角色拥有不同的权限,确保系统的安全性和数据的准确性。 2. **课件分类与上传**:教师可以上传和管理自己的课件,支持多种文件格式,并可以对课件...

    .NET之美:.NET关键技术深入分析

    目录 第一部分C#语言基础 第1章C#类型基础 1.1值类型和引用类型 1.1.1值类型 1.1.2引用类型 1.1.3简单类型 ...第14章 基于角色的安全性 第15章 .NET中的反射 第16章 多线程 第17章 对象生存期与垃圾收集

    北京中科信软 Visual Basic.NET培训

    二 .NET框架&C#编程 面向对象的基本知识体系 .NET中的面向对象设计与应用 C#与设计模式 泛型 C#中的新特性 程序集 .NET应用程序部署和版本控制 委托和事件 线程 反射 对象序列化 数据流和文件 Internet...

    asp.net教学讲义

    第七章:ASP.NET的安全性 111 7.3安全性的概念 111 7.4 ASP.NET安全性的类型 111 7.5 身份验证 111 7.5.1 实现基于表单的身份验证 112 7.6创建和配置应用程序服务数据库 115 7.6.1 使用网站管理工具管理用户和角色 ...

    asp.net技术内幕(1)

    第一部分 使用ASP.NET Web表单 &lt;br&gt;第1章 建立ASP.NET页面 &lt;br&gt;1.1 ASP.NET和.NET框架 1.1.1 .NET框架类库 1.1.2 理解名称空间 1.1.3 标准的ASP.NET名称空间 1.1.4 与.NET框架兼容的语言 ...

    计算机专业毕设ASP.NET信息安全研究所设备管理系统的设计与实现(源代码+论文).rar

    4. **权限控制与安全性**:实现对不同用户角色的权限控制,确保敏感数据的安全性和隐私性。 5. **报表统计与分析**:提供丰富的报表统计和分析功能,帮助用户深入了解设备的使用情况和潜在问题。 6. **可扩展性与二...

    ASP.NET3.5典型模块开发源代码

    1.3 基于角色的登录方式 10 1.3.1 在应用程序中启用角色 10 1.3.2 创建角色 10 1.3.3 创建角色访问规则 11 1.3.4 赋予用户角色权限 11 1.3.5 验证角色的登录 12 1.4 匿名用户的授权管理 12 1.5 小结...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    4.6.6 在asp.net中引用名称空间 241 4.7 创建自己的名称空间 241 4.8 my关键字 244 4.8.1 my.application名称空间 244 4.8.2 my.computer名称空间 248 4.8.3 my.forms名称空间 251 4.8.4 my.resources...

    计算机专业毕设aSP.NET某中学学生成绩管理系统的设计(源代码+论文).rar

    1. **用户角色管理**:系统支持管理员、教师、学生和家长四种角色,每种角色具有不同的权限,确保数据的安全性和隐私性。 2. **成绩录入与更新**:教师可批量或单个录入学生成绩,并支持成绩的修改和删除操作。 3. *...

    ASP.net技术内幕

    书中包含数百个代码示例,读者可以使用这些示例开始建立自己的网站 前言 &lt;br/&gt;第一部分 使用ASP.NET Web表单 &lt;br/&gt;第1章 建立ASP.NET页面 &lt;br/&gt;1.1 ASP.NET和.NET框架 1.1.1 .NET框架类库 ...

    计算机专业毕设精选-ASP.NET信息安全研究所设备管理系统的设计与实现(源代码+论文).rar

    该系统旨在满足信息安全研究所在设备采购、分配、维护和管理方面的需求,通过信息化手段提高设备管理的效率和安全性。 **功能特点:** 1. **用户友好的界面**:采用ASP.NET Web Forms或MVC框架构建,界面简洁明了...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    内容简介回到顶部↑本书全面介绍了ASP.NET各种编程技能和2.0版中的巨大变化,并详细阐述了2.0版中的每个新特性。书中提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合...

    计算机专业毕设精选-ASP.NET图书管理系统(完整的).rar

    4. 实现了基于角色的权限控制,确保系统的安全性。 本资源不仅适用于计算机专业的毕业生进行毕业设计,还可作为高校图书馆、企事业单位图书资料室的参考工具。同时,该系统具有高度的可定制性和二次开发潜力,可...

    ASP.NET4高级程序设计(第4版) 3/3

     《ASP.NET 4高级程序设计(第4版)》是ASP.NET领域的鸿篇巨制,全面讲解了ASP.NET4的各种特性及其背后的工作原理,并给出了许多针对如何构建复杂、可扩展的网站从实践中得出的建议。书中还深入讲述了其他ASP.NET图书...

Global site tag (gtag.js) - Google Analytics