博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对ASP.NET网站执行代码覆盖率测试发生System.Security.VerificationException异常的解决方案...
阅读量:5955 次
发布时间:2019-06-19

本文共 1986 字,大约阅读时间需要 6 分钟。

当你对ASP.NET 4.0网站执行代码覆盖率测试时,可能会遇到下面这个异常:

System.Security.VerificationException: Operation could destabilize the runtime.

一般来说,VerificiationException都是关于代码访问安全(CAS)的问题,.NET在执行托管代码之前,首先会验证这个托管程序的强签名,通过确定其来源来判定该托管程序应该拥有的权限。比如说,如果托管程序是微软公司的签名,我们当然是无比的信任它—除非你不用Windows操作系统。机器管理员也可以依据托管程序的来源来决定该托管程序应该拥有的权限,例如读磁盘文件、操作注册表这些操作都是可以配置的权限。比方说,管理员可以在机器上设置,由360以及QQ发行的托管程序,只能访问显卡(绘制界面)以及读写网络,而不能执行访问磁盘文件等操作。

执行代码安全的前提是,整个程序完全是由托管代码写成的,如果托管代码里混合非托管代码,无论是通过托管C++写成的,还是里面执行了平台调用(P/Invoke)。就破坏规矩了,因为非托管代码可以使用指针操作,以及调用其它非托管代码的方式,甚至—启动一个进程,然后将原来的托管程序杀掉。因此,进行代码访问安全的前提条件是,整个应用程序都是使用托管代码写成的,为了保证这个前提条件,CLR在执行托管程序之前,首先会验证程序是否满足—整个程序都是用托管代码编写这一条件。如果不满足这个条件,那么CLR会扔出VerificationException,中断托管程序的执行,在.NET SDK里,你可以通过PEVerify.exe这个程序验证一个程序是否可以通过这个验证。

 

当然,你可能会说,很多本机运行的托管程序,即使调用了非托管代码,例如执行了一个平台调用,还是可以照常执行啊。那是因为,当你的程序使用了/unsafe编译选项时,C#编译器会自动在托管程序添加上SuppressUnmanagedCodeSecurityAttribute这个属性,这个属性告诉CLR。如果程序是在本机执行,那么就跳过验证是否调用了非托管代码这一环节。有兴趣的读者可以把调用非托管代码的托管程序放在一个网络路径上,从那里执行,应该就可以看到SecurityException了。

 

回到ASP.NET网站的情形,当你将ASP.NET网站的装配件(Assembly)使用 vsinstr.exe创建一个可以收集代码覆盖率的装配件(Assembly)时,vsinstr.exe实际上在装配件(Assembly)的IL代码里,添加了很多收集代码覆盖率的代码。这个过程可以参考我以前的文章:。这些代码里,有一个很重要的步骤,就是联系本机运行的VSPerfMon.exeVSPerfMon.exe是用来收集整个机器上代码覆盖率的,不知道是什么愿意,联系本机运行的VSPerfMon.exe过程是通过非托管的API实现的,这就意味着vsinstr.exe生成的 装配件(Assembly)就必须调用到非托管代码,因此也就通过CLR的验证过程。

 

在2.0的时候,你可能还不会碰到这个问题,但是在4.0里面,你就很有可能碰到这个问题—特别是在网站运行在IIS下的话,经常发生。

 

既然道理已经明白了,修复起来也很容易:

  1. 将网站,以及所有需要做代码覆盖率的装配件(Assembly)—也就是被vsinstr.exe处理过的装配件(Assembly),在它们的源代码(既然你要收集代码覆盖率,那肯定是由源代码的)里的AssemblyInfo.cs里,加上下面这一行

 

[assembly: SecurityRules(SecurityRuleSet.Level1, SkipVerificationInFullTrust=true)]

 

  1. 然后在网站的web.config里,做如下修改(这个选项也可以通过IISAdmin.exe修改):

 

 <system.web>

    <trust level="Medium" />

 

     …

 </system.web>

 

说明,SecurityRules这个属性,告诉CLR,这个装配件(Assembly)有自定义的安全机制,SecurityRuleSet.Level1说明采用.NET 2.0下面的安全验证策略,SkipVerificationInFullTrust告诉CLR,只有网站运行在FullTrust模式下,才可以跳过安全验证。最后第二步就是将网站的运行模式改在FullTrust模式下。

标签: 
本文转自 donjuan 博客园博客,原文链接:   http://www.cnblogs.com/killmyday/archive/2010/11/16/1878847.html
,如需转载请自行联系原作者
你可能感兴趣的文章
文件上载限制4gb_科普一下FAT32和NTFS两种文件系统的区别
查看>>
ant指定servlet版本_数据版本控制之Flyway
查看>>
go 修改结构体方法_Go语言基础:结构体
查看>>
前端radio单选框默认选中_WEB前端,form表单
查看>>
不需要软著的安卓应用市场_开发APP应用不可缺少的五项工作
查看>>
win7开启ftp被动模式_【扫盲】FTP基础知识详解
查看>>
编程心得体会_Code snippet在手,编程不愁!
查看>>
linux图形界面sdk,Linux SDK入门指南
查看>>
国际学院c语言作业,C语言程序的国际化
查看>>
四阶龙格库塔法c语言程序,四阶龙格库塔法C语言(西安交大)
查看>>
c语言中无windows函数库,关于C语言, GCC/MSVC中,如何写出一个真正意义上的不依赖库的程序?...
查看>>
欧洲语言框架A1到C2,法语等级 A1、A2、B1、B2、C1、C2
查看>>
c语言中以追加只写方式打开文本文件,C语言中打开文件读取,写入的操作
查看>>
c语言编程 企业发放,求c语言编程企业员工全年销售额统计及奖金发放系..._统计师_帮考网...
查看>>
C语言编辑中午和英语库,懂英语和C语言的来
查看>>
c语言cabd快速查询的方法,滨州医学院 数据结构C语言版习题精选
查看>>
c语言中秋log10的函数,10本科生的C++成长轨迹7 - ACM培训:数组&函数&指针
查看>>
android 设备运营商,Android设备悲剧:新技术让运营商可以向设备“偷偷”安装软件...
查看>>
html语言link,HTML <link>标签
查看>>
android9单手模式,荣耀9青春版安卓8.0上手:单手操作爽翻天
查看>>