.NET Framework调用的"自由"安全性 一些活动,如读写文件,显示对话框,读写环境变量,可以通过包含在框架安全构架中的.NET Framework方法实现。这就使.NET Framework能根据安全策略允许或不允许一个操作,而不需要程序员做额外的工作。尽管暴露了保护资源的管理类的创建者在他们的库中做了明确的安全需求,使用.NET Framework类库访问受保护资源的开发人员可以自由地利用代码访问安全系统;他们不必作出明确的安全调用。
管理员可以通过决定给予哪些许可来优化安全策略,然后,依靠.NET Framework处理所有的安全操作。代码访问安全能阻止大部分的恶意攻击,对代码的验证减少了缓存溢出和其它会导致安全攻击的不期望的行为。因此,应用程序和组件生来就受到了保护,它们免于大多数安全问题的冲击,而这些安全问题一直困绕着本地代码的实现。
基于角色的安全 有时根据已认证的身份或根据与代码执行上下文相关的角色作出认证决定是合适的。例如,金融和企业软件可以通过评估角色信息的企业逻辑加强策略。根据作出请求的用户角色可以对金融交易的数据进行限制。出纳被允许可以处理一定金额的请求,而多于该金额的所有工作需要监督人的角色来处理。
身份可以映射到登录系统的用户,或由应用程序定义。相应的原则封装了身份和其它相关的角色信息(例如,但并不限于此,用户的"组"由操作系统定义)。
认证和授权 认证是一个过程,它接收来自用户的证书,并对证书的授权进行确认。如果证书是有效的,那么用户就可以说他拥有已认证的身份。而授权的过程是:确定认证用户是否能够访问给定的资源。认证可通过系统或企业逻辑来完成,通过某个API它是或获得的。认证API是完全可扩展的,因此开发人员根据需要使用自己的企业逻辑。开发人员可以对他们的认证需求进行编码,也可以修改底层的认证方法而无需对他们的代码作太大变化。除了微软Windows?操作系统身份认证外,还有的认证方法包括基本HTTP,摘要和 Kerberos,以及微软Passport和基于窗体的认证。这些认证方法已经完全集成到ASP.NET中了。
在ASP.NET窗体认证中,用户提供证书,并提交窗体。如果应用程序簦别请求,系统发送一个cookie ,该cookie以某种形式包含包含了证书或包含重新获得身份的关键字。接下来发送的请求在头中包含了cookie,ASP.NET处理程序通过应用程序所期望的任何有效方法对这些请求认证和授权。如果请求没有经过认证,HTTP客户端将用于把请求发送到认证窗体,在那里用户可能提供信任证书。窗体认证有时用于个性化--为已知用户的内容进行定置。在一些情况下,身份是问题所在而不是认证,因此用户的个性化信息可以简单地通过访问用户或获得。
授权的目的是确定作出请求的身份是否被给予了对给定资源的访问权。ASP.NET提供了两种类型的授权服务:文件授权和URL授权。文件授权根据正在作用的方法和作出请求的身份决定用户使用于哪个访问控制列表。URL授权是URI名称空间和不同用户或角色间的逻辑映射。
隔离存储 .NET Framework提供了一个特殊的功能,隔离存储,用于存储数据,甚至是当不允许对文件进行访问时--例如,当从Internet下载了一个管理控件,并运行它,为它提供了有限的许可权但没有权力读写文件。
隔离存储是一组新的用于.NET支持的用于本地存储的类型和方法。在本质上,每个组合可以访问磁盘上一断被隔离的存储空间。它不允许访问其它数据,隔离存储只对为它创建的组合有效。
隔离存储也可被应用程序用于保存活动记录,保存设置,或者将状态数据保存到磁盘上以备将来之用。因为隔离存储的位置是预先决定好的,所以隔离存储为指定唯一存储空间提供了一种方便的方式,而不需要决定文件路径。
从本地企业局域网获得的代码具有相似的限制,但更少,它可以访问大限额的隔离存储。最后,从受限站点区域(不信任站点)来的代码没有对隔离存储的访问权。
加密 .NET Framework提供了一组加密对象,它们支持加密算法、数字签名、散列、生成随机数,是通过众所周知的运算法则实现的,如RSA, DSA, Rijndael/AES, Triple DES, DES, 和 RC2, 以及MD5, SHA1, SHA-256, SHA-384 和 SHA-512散列算法。同时还支持在IETF和W3C开发的XML数字签名规范。.NET Framework使用加密对象支持内部服务。这些对象还作为管理代码提供给需要加密支持的开发人员。
如何指定安全性?
如果要对组合运行时的行为进行修改,根据程序员的需要,可以作出声明式安全或强迫式安全的修改。
声明式安全 声明式安全使程序员可以直接在组合代码的元数据中为组合指定安全需求。许可请求和所有其它形式的声明式安全是在代码中是作为定置属性指定的。类,属性和方法的注释用于优化许可。例如,声明式安全可用于类的调用者在调用方法前检查调用者是否被已知地行商签名过,或有一个特定的强名。
由于声明属性是组合元数据的一部分,所以组合的安全需求易于辨别。可以使用工具对组合进行扫描,以发现哪些方法需要某些许可,哪些方法断言了某些许可。
当被请求的活动和许可在编译时是知道时,声明式检查可作为选择的解决方案之一。例如,如果方法总是检查对C:\temp的写访问许可,那么许可检查就会从声明中得到好处。另一方面,如果被请求的具有访问权的位置发生了变化,那么强迫式安全也许是一个比较好的解决方案。
强迫式安全 强迫式安全直接在代码中实现。程序员通过程序采取安全活动,并且根据安全堆栈的状态决定是给予还是拒绝许可。例如,当一个方法请求访问一个特定的文件时,如果调用者(或方法的任何一个调用者)没有被给予必需的许可权限,那么请求失败。因为强迫式安全是通过程序实现的,所以满足了动态需求。如果你需要对一个特定文件的访问许可,但该许可还要根据其它信息发生变化,那么,强迫式安全就是可选的解决方案。
总结 .NET Framework安全迎合了这种事实:软件向多样化的移动组件发发展,并根据这种事实提供保护。在一个细化的、可扩展的策略和许可系统下,用户能够运行功能强大的代码,而同时减少相关的风险。在没有运行时对用户作出信任决定时,管理员可以在各个级别创建强壮的安全策略。策略是完全可定置的。开发人员能够集中解决应用程序逻辑,而不用关心核心的安全问题(它由CLR透明地处理)。然而,开发人员可以在任何时候扩展安全模型。
查看本文来源