2008-08-21 24 views
5

我想测试部分信任环境中某段.NET代码的行为。什么是最快的方式来设置呢?随意假定我(和其他读者)是全部CAS noobs。在部分信任环境中测试.NET代码

@Nick:谢谢你的回复。唉,有问题的工具是明确的非托管代码。在我的问题中,我没有说“管理”,也不应该假定人们会从“.NET”标记中推断出它。

回答

3

这是一个很好的问题,特别是从TDD的角度来看,并验证不同信任场景下的代码。

我想我会处理这个的办法是沿着线的东西 -

  • 在使用AppDomain.CreateDomain()过载,使您可以在通过我的TDD的代码创建一个AppDomain PermissionSet中。 PermissionSet将被构建为匹配您想要测试的不同信任方案。

  • 负载含有下测试逻辑到应用程序域

  • 组件创建的类型/调用方法等中的应用程序域,陷阱安全异常

东西有点像该实例。我还没有时间敲定一个概念证明呢。

1

使用Microsoft Application Verifier

AppVerifier的帮助确定:

  • 当应用程序正确使用API​​: (不安全TerminateThread的API,正确使用线程本地存储(TLS的)的API,邻正确使用虚拟空间操作的(。例如,的VirtualAlloc,MapViewOfFile)。
  • 应用程序是否使用结构化异常处理隐藏访问冲突。
  • 应用程序是否试图使用无效的句柄。
  • Whethe r堆中有内存损坏或问题。
  • 应用程序是否在资源不足的情况下耗尽内存。
  • 是否发生关键部分的正确使用。
  • 在管理环境中运行的应用程序是否可以在特权较低的环境中正常运行。
  • 应用程序作为受限用户运行时是否存在潜在问题。
  • 线程上下文中未来函数调用中是否存在未初始化的变量。
1

您应该看看.NET Framework配置工具。这是在.NET SDK,你可以在这里上运行它找到的指令...... http://msdn.microsoft.com/en-us/library/2bc0cxhc.aspx

运行安全策略部分,你会发现3策略级别:企业,计算机和用户。如果您钻入机器或用户,您会发现代码组定义权限集。当你说你想在部分信任环境中测试一些.NET代码时,我想你会想根据已经定义的标准权限集之一进行测试,例如Internet。您需要定义一个代码组,它与您的应用程序(或特定程序集)相匹配,并将您选择的权限集分配给代码组

您也可以定义您自己的自定义权限集,但现在让我们保持简单。

选择您希望您的新代码组在机器范围内存在,还是仅存在于您的用户帐户,并相应地钻入机器或用户策略级别。您会看到一个名为_All _ Code_的代码组。创建一个子码组一个内,通过右键单击并选择新建...

给它一个名字,说PartialTrustGroup,然后单击下一步

您必须为此组指定成员资格条件,并且存在各种类型。我想在我的机器上创建一个名为PartialTrust的特定文件夹,然后创建一个匹配的URL成员资格条件。因此,我的网址如下所示... file:// c:/ users/martin/documents/partialtrust/*

*是通配符,用于捕获该路径下的任何程序集。点击下一页

现在您可以为您的新代码组选择一个权限。目前,请选择互联网。这是一个相当严格的集合,类似于Java applet沙箱。点击下一步完成

现在右键单击您的新代码组,然后选择属性。在常规选项卡中,确保选中最上面的复选框,然后单击确定。

现在,从指定的URL下的某个位置加载的任何.NET程序集都将对其应用Internet权限集。如果您没有编写代码仔细观察缩减的权限集,那么预计会得到一些SecurityExceptions。

对不起,这是一个很长的描述。它确实比听起来简单得多。

3

你要找的是内置到Visual Studio的功能:

你的项目的安全选项卡中,有一个“高级”按钮,让你配置是否要在调试完全信任或指定的信任级别。

+0

+1这只是帮了我很多谢谢。 – 2011-02-14 13:35:54

1

我刚在博客上发布了一篇名为Partial Trust Testing with xUnit.net的文章。它详细介绍了我们在Entity Framework团队中使用的基于xUnit.net的框架以中等信任度来执行代码。

下面是它的用法的一个例子。

public class SomeTests : MarshalByRefObject 
{ 
    [PartialTrustFact] 
    public void Partial_trust_test1() 
    { 
     // Runs in medium trust 
    } 
} 

// Or... 

[PartialTrustFixture] 
public class MoreTests : MarshalByRefObject 
{ 
    [Fact] 
    public void Another_partial_trust_test() 
    { 
     // Runs in medium trust 
    } 
}