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

在部分信任环境中测试.NET代码,.net,code-access-security,.net,Code Access Security,我想测试部分信任环境中某段.NET代码的行为。最快的设置方法是什么?请随意假设我(和其他读者)是彻头彻尾的无赖 @尼克:谢谢你的回复。唉,所讨论的工具是显式用于非托管代码的。在我的问题中,我没有说“managed”,也不应该假设人们会从“.NET”标记推断出它。使用 AppVerifier帮助确定: 当应用程序正确使用API时: (不安全的TerminateThread API.,正确使用线程本地存储(TLS)API.,o正确使用虚拟空间操作(例如,VirtualAlloc、MapViewOf

我想测试部分信任环境中某段.NET代码的行为。最快的设置方法是什么?请随意假设我(和其他读者)是彻头彻尾的无赖

@尼克:谢谢你的回复。唉,所讨论的工具是显式用于非托管代码的。在我的问题中,我没有说“managed”,也不应该假设人们会从“.NET”标记推断出它。

使用

AppVerifier帮助确定:

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

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

我想我的方法应该是:

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

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

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


有点像这样。我还没有时间做概念验证。

你应该看看.NET Framework配置工具。它在.NET SDK中,你可以在这里找到运行它的说明。。。

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

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

选择是希望新代码组存在于计算机范围内,还是仅针对您的用户帐户,并相应地深入到计算机或用户策略级别。您将看到一个名为_All uu code_u的代码组。通过右键单击并选择“新建”,在该代码组中创建一个子代码组

给它一个名称,说PartialTrustGroup,然后单击Next

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

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

现在,您可以为新代码组选择权限集。现在,选择Internet。这是一个限制性很强的权限集,类似于Java小程序沙盒。单击“下一步”并完成

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

现在,从您指定的URL下的位置加载的任何.NET程序集都将应用Internet权限集。如果您没有编写代码仔细观察缩减的权限集,则可能会出现一些SecurityException


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

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


在项目的“安全性”选项卡上,有一个“高级…”按钮,可用于配置是要在完全信任的情况下调试,还是在指定的信任级别上调试。

我刚刚在我的博客上发布了一篇标题为的文章。它详细介绍了我们在实体框架团队中使用的基于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
    }
}