WCF中的代码访问安全性,第1部分

目录

CAS 概览

客户端 CAS

部分信任的客户端

客户端请求

原始 WCF 请求

PartialTrustClientBase<T> 的结构化请求

分析 Invoke 的请求

实现客户端结构化请求

在Microsoft .NET Framework 1.0 中引入的代码访问安全性 (CAS) 可 能是 .NET 与非托管代码相比唯一有所区别的功能。CAS 内置于 .NET Framework 的每个结构中,它影响托管代码中的每项操作,这些是非托管代码永 远无法做到的。

Windows Communication Foundation (WCF) 的第一个版本并不支持 CAS;System.ServiceModel 程序集不允许禁用了 CAS 支持的任何部分信任的调 用方。第二版在某些 HTTP 绑定中引入了对 CAS 的初步支持,但仅限于有限的 几种方案。这一更改使我能够着手编写小型框架,可以在不影响 WCF 编程模型 或 CAS 的情况下提供对 CAS 的全面支持。

在有关 CAS 的两个专栏的第一个中,我将简要讨论 WCF 中的代码访问安全 性,然后再介绍我的一个解决方案,它可以针对 WCF 服务启用部分信任的客户 端。

CAS 概览

.NET Framework 定义了 24 种不同的安全权限,它们几乎可以控制任何类型 的操作。这些权限包括文件 I/O、UI、反射、安全性、网络、数据访问等各个方 面。权限类型可以应用到特定的资源,例如文件 I/O 权限中的读取特定文件的 权限,或者 UI 权限中的显示特定类型窗口的权限。它也可以是完全拒绝(例如 拒绝执行任何文件 I/O 操作)或完全授予(例如不受限制的文件 I/O 访问)。

权限被分组为权限集,并为每个程序集都分配了一个。.NET Framework 定义 了一些标准权限集,例如 FullTrust(暗含所有权限)或 Execution(仅可访问 CPU 的权限)。管理员可以使用 .NET Configuration 工具定义自定义权限集, 而开发人员则可以通过编程方式来定义(或使用权限集文件,或使用应用程序所 需的权限集来定义)ClickOnce 应用程序清单。

加载程序集时,CLR 会为各个程序集分配其权限。程序集将提供某种形式的 身份证明以获得这些权限。其中包括检查程序集加载位置的基于来源的证明(例 如,所有来自全局程序集缓存 (GAC) 的代码都被授予完全信任权限),或者检 查程序集本身某些方面的基于内容的证明(例如,程序集的强名称)。

每个应用程序域始终都会被分配一个被称为应用程序域安全策略的权限集, 任何加载到该应用程序域的程序集都被限定为该权限集;否则将会出现安全异常 。新的应用程序域在开始时都具有 FullTrust 权限集,并且由于源自本地计算 机的所有代码默认都将获得 FullTrust 权限集,所以大多数基于 .NET 的应用 程序都以预设方式工作,与根本不使用 CAS 的效果完全一样。这使得代码(以 及用户、数据、计算机甚至网络)易于遭受各种形式的破坏,从病毒或蠕虫之类 的安全攻击到单纯的人为错误。

以低于完全信任级别运行的代码称为部分信任的代码。无论何时,托管代码 的任何片断试图使用 .NET Framework 访问资源或执行任何操作时(包括与非托 管代码之间的互操作),.NET Framework 都会验证包含该代码的程序集是否具 有执行该操作所需的权限。如果该程序集缺少所需的权限,.NET Framework 将 抛出安全异常,从而中止该操作。

由于受信任的程序集可能会被恶意的、不太受信任的程序集引诱执行某些不 太受信任的程序集没有权限执行的操作,所以仅对执行某项操作的程序集提出权 限要求尚嫌不够。因此,.NET Framework 会遍历整个调用方堆栈,确保堆栈中 的每个调用方都具有必要的权限。这种堆栈遍历被称为“安全要求” ,无论执行程序集的权限如何都必须满足此要求。

您的代码也可以声明权限——即,声明堆栈中的每个调用方都具 有所要求的权限。权限声明具有终止堆栈遍历的作用。您的代码只能声明它所具 有的权限,并且这还需要额外的特殊安全声明权限。

在声明一项权限的同时要求另一项就位是一种不错的想法。开发人员可以使 用专门的权限类或使用匹配的属性集通过编程方式要求或声明权限。开发人员也 可以在程序集、类或方法级别主动拒绝权限。拒绝权限或仅允许执行代码所需的 有限权限集可以减少受到引诱攻击的几率。有关代码访问安全性的更多信息,请 参阅我编写的《Programming .NET Components 2nd Edition》一书中的第 12 章,我在其中使用超过 100 页的篇幅介绍了这种基础方法及其应用。

时间: 2024-11-01 17:43:06

WCF中的代码访问安全性,第1部分的相关文章

向WCF新增代码访问安全性,第2部分

目录 .NET Framework 3.5 中的宿主端 CAS 部分受信的服务 App Domain Host 实现 AppDomainHost 部分受信的宿主 结构化宿主端安全要求 实现结构化宿主要求 AppDomainHost 的其他方面 在 2008 年 4 月刊的这一专栏中,我讨论了缺少对代码访问安全性 (CAS) 足够支持的情形,以及向 Windows Communication Foundation (WCF) 添 加合适 CAS 支持的动机.然后展示了如何在客户端添加该支持,从而使

ASP.NET 代码访问安全性

asp.net|安全|安全性|访问  使用 ASP.NET 来承载多个 Web 站点的一个主要优点是:公共语言运行库支持代码访问安全,可帮助保护服务器应用程序的安全.根据关于代码来源的证据(例如带有强名称的程序集或源的 URL 等证据),代码被分配到安全区域分类中.如果不能为安装在公共服务器上的各个互不相关的应用程序配置安全机制,那么 ASP.NET 页中属于一个应用程序的代码将能够读取另一个应用程序中的文件(例如 Web.config 文件).以完全信任方式运行的应用程序只受操作系统帐户的限制

c++如何向访问的网页中添加代码?

问题描述 c++如何向访问的网页中添加代码? 我有一个设想 写一个这样的程序或者插件 当其运行的时候 电脑访问某个网站时候返回的页面中会被添加上指定的代码内容 这个可以实现吗? 解决方案 可以参考http://jingyan.baidu.com/article/b907e627fb90fd46e7891c3c.html 解决方案二: 做浏览器插件.ie的bho.firefox的addon.chrome的app 它们可以拿到访问网站.页面内容.也可以网页插入js,html等.

[原创]x.509证书在WCF中的应用(Web/IIS篇)

在上一篇"x.509证书在WCF中的应用(CS篇)"里,我们知道了如何在应用程序中,利用x.509证书来验证WCF的消息安全(没看过的朋友建议先看下,地址http://www.cnblogs.com/yjmyzz/archive/2008/08/20/1272550.html),这一篇我们将尝试把x.509证书放到IIS里来验证WCF. WCF宿主在IIS和普通应用程序里,原理虽然没什么不同,但在实际测试中发现,如果服务端与客户端都采用x.509证书来验证,服务端设置的自定义验证客户端

ASP.NET中促进代码重用的2种模式

开发复杂的动态ASP.NET应用程序时,必须尽量减少重复代码,提高应用程序的重用性和灵活性.在某些应用程序中,用户采取的不同操作可能具有不同的控制器逻辑,但结果都是相同的视图(例如显示一个产品列表时,可能允许用户增添或删除一件产品.但在控制器引导用户完成了添加或删除过程后,最终显示的都是同样的产品视图,其中含有修改过的数据).  开发可重用的程序逻辑时,第一步就是尽量减少服务器脚本页中的代码数量.脚本页中的逻辑很难(有时甚至不可能)重用,造成视图和控制器分离得不够好.另外,它的测试和调试也显得异

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

.net框架|安全|安全性 Permissions对象       作为.NET安全性两个重要的分支,基于角色的安全性和代码访问安全都离不开一个重要的概念--权限(permissions).在基于角色的安全性中,PrincipalPermission类用来检查调用线程的用户身份:而在代码访问安全中,从CodeAccessPermission派生的类则用来检查执行当前方法的所有线程各自的权限.       权限对象通过已有的安全策略来说明操作是否被允许或拒绝.对于代码访问安全权限(不过这不适用于用

用代码访问InfoPath表单内容

表单是MOSS的一个很重要的特性,特别是有了Form Services的支持后,我们在做表单解决方案的时候,经常会用到Infopath, 那么如何使用代码访问保存于SharePoint表单库中的InfoPath表单的内容,是必需知道的. 总结了下,有如下3种方式可实现代码对表单内容的访问: 1.提升表单模板属性 2.通过XmlDocument 对象对表单文件操作 3.反序列化表单数据架构 接下来,分别简单谈谈这3种方法的简单实现步骤 第一种方式: 提升表单模板属性表单操作: 在设计完表单模板,执

深入解析Linux系统中的SELinux访问控制功能

  SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统.NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件.SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到. SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制

在 Go 语言中增强 Cookie 的安全性

本文讲的是在 Go 语言中增强 Cookie 的安全性, 原文地址:Securing Cookies in Go 原文作者:Jon Calhoun 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:lsvih 校对者:tmpbook, Yuuoniy 在我开始学习 Go 语言时已经有一些 Web 开发经验了,但是并没有直接操作 Cookie 的经验.我之前做过 Rails 开发,当我不得不需要在 Rails 中读写 Cookie 时,并不需要自己去实现各