在部分信任环境中测试.NET代码

时间:2008-08-21 18:29:43

标签: .net code-access-security

我想在部分信任环境中测试某段.NET代码的行为。设置它的最快方法是什么?请随意假设我(和其他读者)是CAS CAS的总瘤刀。

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

5 个答案:

答案 0 :(得分:3)

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

我认为我接近这个的方式将是 -

  • 使用AppDomain.CreateDomain()重载在我的TDD代码中创建一个AppDomain,允许您传入PermissionSet。构造PermissionSet以匹配您要测试的不同信任方案。

  • 将包含待测逻辑的程序集加载到应用程序域

  • 在应用程序域中创建类型/调用方法等实例,捕获安全性异常

有点像那样。我还没有时间敲打概念验证。

答案 1 :(得分:3)

您正在寻找的功能内置于visual studio中:

在项目的安全性选项卡上,有一个“高级...”按钮,可让您配置是要以完全信任还是在指定的信任级别进行调试。

答案 2 :(得分:1)

使用Microsoft Application Verifier

AppVerifier有助于确定:

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

答案 3 :(得分:1)

您应该查看.NET Framework配置工具。它位于.NET SDK中,您可以在此处找到有关运行它的说明... http://msdn.microsoft.com/en-us/library/2bc0cxhc.aspx

运行时安全策略部分中,您将找到3个策略级别:Enterprise,Machine和User。如果您深入了解计算机或用户,您将找到代码组权限集的定义。当您说要在部分信任环境中测试某些.NET代码时,我想您将要测试已定义的标准权限集之一,例如 Internet 。您需要定义与您的应用程序(或特定程序集)匹配的代码组,并将您选择的权限集分配给该代码组

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

选择您希望新代码组是在计算机范围内存在,还是仅存在于您的用户帐户,并相应地深入了解计算机或用户策略级别。您将看到一个名为_All _ Code_的代码组。通过右键单击并选择 New ...

,在该组中创建子代码组

为其命名,例如 PartialTrustGroup ,然后点击下一步

您必须为此组指定成员资格条件,并且有多种类型。我喜欢在我的机器上创建一个名为 PartialTrust 的特定文件夹,然后创建匹配的URL成员资格条件。所以,我的网址看起来像这样...... 文件:// C:/用户/马丁/文档/ partialtrust / *

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

现在,您可以为新代码组选择权限集。现在,选择 Internet 。它是一个相当严格的集合,类似于Java applet沙箱。单击下一步完成

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

现在,从您指定的URL下方的位置加载的任何.NET程序集都将应用 Internet 权限集。如果您没有编写代码以仔细观察减少的权限集,则期望获得一些SecurityExceptions。

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

答案 4 :(得分: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
    }
}