问题标签 [partial-trust]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
521 浏览

.net - 在 Visual Studio 中以部分信任的方式运行 MSTest

我希望能够以部分信任的方式运行 MSTest。这将允许我配置我的单元测试调用的代码可以做什么和不能做什么。

我试图解决的问题是让我的自动化(单元)测试在使用文件系统、数据库、系统时钟和其他外部资源之类的东西时失败。通过以部分信任运行,我可以配置 AppDomain 可以执行和不可以执行的操作类型。这使我能够检测代码中未正确抽象出已使用资源的位置。

如果还有其他方法可以实现这一点,请告诉我。

0 投票
1 回答
1758 浏览

wpf - 通过 HostScript 在 XBAP 中的部分信任 JavaScript 对象访问:回调中的 SecurityException

我遇到了 WPF 4 中添加的 XBAP 脚本互操作功能的问题。它涉及以下组合:

  1. 从 .NET 访问脚本对象的成员
  2. 在从 JavaScript 调用的回调中运行 .NET 代码
  3. 在部分信任中运行

这似乎是一个“选择任何两个”的场景......如果我尝试做所有这三件事,我会得到一个SecurityException.

例如,组合 1 和 3 很容易。我可以将其放入托管网页的脚本中:

然后在我的 WPF 代码后面的按钮单击处理程序中,我可以这样做:

即使在部分信任部署中,它也能正常工作。(我在 Visual Studio 2010 中使用 WPF 浏览器应用程序模板提供的默认 ClickOnce 安全设置,它可以像在 Internet 区域中运行一样调试 XBAP。)到目前为止,一切都很好。

我也可以将 2 和 3 结合起来。为了使我的 .NET 方法可以从 JavaScript 调用,遗憾的是我们不能只传递一个委托,我们必须这样做:

然后我可以声明一个如下所示的 JavaScript 方法:

现在在一个 WPF 按钮单击处理程序中,我可以这样做:

因此,我的 WPF 代码调用(通过BrowserInteropHelper.HostScript)我的 JavaScriptCallMethod函数,该函数又调用了我的 .NET 代码——具体来说,它调用了MyMethod我的 CallbackClass 公开的方法。(或者我可以将回调方法标记为具有[DispId(0)]属性的默认方法,这可以让我简化 JavaScript 代码 - 脚本可以将参数本身视为方法。任何一种方法都会产生相同的结果。)

MyMethod成功调用回调。我可以在调试器中看到从 JavaScript (42) 传递的参数正确通过(已正确强制为 int)。当我的方法返回时,由于CallMethod函数的其余部分,它返回的字符串最终会出现在我的 HTML UI 中。

太好了 - 所以我们可以做 2 和 3。

但是将这三者结合起来呢?我想修改我的回调类,以便它可以与脚本对象一起使用,就像我的第一个片段返回的那个ReturnSomething函数一样。我们知道使用这样的对象是完全可能的,因为第一个示例成功了。所以你会认为我可以这样做:

然后修改我的 JavaScript 看起来像这样:

然后像以前一样从我的 WPF 按钮单击处理程序中调用该方法:

这成功调用了 JavaScriptCallMethod函数,该函数成功回调了MyMethodC# 方法,但是当该方法尝试检索arg.Foo属性时,我得到一个SecurityException带有RequestFailed. 这是调用堆栈:

这就是异常报告的整个跟踪。在上面CallbackClass.MyMethod,Visual Studio 显示了两个 [Native to Managed Transition] 和一个 [AppDomain Transition] - 这就是整个堆栈。(显然我们现在在另一个线程上。这个回调发生在线程面板描述为工作线程的地方 - 我可以看到主线程仍然位于我的 WPF 按钮单击处理程序中,等待对 JavaScript 的调用CallMethod函数返回。)

显然,问题在于 DLR 最终将 JavaScript 对象包装在ComBinder需要完全信任的对象中。但是在前面的例子中,我调用了一个 JavaScript 方法HostScript,它返回给我一个对象,为我HostScript将它包装在 aSystem.Windows.Interop.DynamicScriptObject中。

该类DynamicScriptObject特定于 WPFs XBAP 脚本互操作 - 它不是通常 DLR 类型的一部分,它在PresentationFramework.dll. 据我所知,它所做的工作之一是使使用 C# 的dynamic关键字访问 JavaScript 属性而不需要完全信任成为可能,即使这些属性是通过 COM 互操作(通常需要完全信任)在盖子。

据我所知,问题在于您只能获取从其他实例(例如)DynamicScriptObject返回的对象的这些包装器。使用回调,这种包装似乎不会发生。在我的回调中,我得到了 C# 通常在普通的旧 COM 互操作场景中给我的那种动态包装器,此时,它要求我完全信任。DynamicScriptObjectHostScript

在完全信任的情况下运行它可以正常工作 - 这将是上面列表中的“1 和 2”组合。但我不想完全信任。(我想要 1、23。)在回调情况之外,我可以很好地访问 JavaScript 对象成员。大多数时候我都可以很好地访问 JavaScript 对象,但在回调中访问相同的对象是被禁止的,这似乎是不一致的。

有没有解决的办法?或者如果我想在回调中做任何有趣的事情,我是否注定要完全信任地运行我的代码?

0 投票
2 回答
1012 浏览

c# - 部分信任:如何在没有泛型类型参数的情况下实例化泛型类型

我正在为 Silverlight 创建一个可重用的库。该库包含一个内部泛型类型,我需要创建这个泛型类型的一个新实例,但是我有一次没有可用的泛型类型参数,只有一个System.Type表示泛型参数的对象。我尝试使用反射创建一个实例,但这失败了,因为这个类是内部的,并且 Silverlight 在部分信任下有效地运行。

这是我到目前为止所尝试的:

这是我的内在类型。没有什么花哨:

我什至尝试滥用Nullable<T>结构作为工厂来创建可以生成我的内部类型的工厂。但是,默认Nullable<T>会转换为空引用:

可以想象,我不想公开这种类型,因为它会污染我的 API。我目前没有想法。我有哪些选择?我可以做些什么来创建这种内部类型?

0 投票
2 回答
599 浏览

c# - ASP.NET 通过程序集改变每页的信任级别?

我有两个 Web 应用程序(预编译的站点),一个是第一方的,将在完全信任的情况下运行。另一个是第三方,应该以部分信任(或具有特定权限)运行。

TrustedAssembly.Web.Pages.MyPage应该在完全信任的默认 AppDomain 中运行。 UntrustedAssembly.Web.Pages.SomePage应该在部分信任的 AppDomain 中运行。

此外,如果TrustedAssembly.Web.Pages.MyPage动态加载,是否UntrustedAssembly.Web.Controls.SomeControl可以在部分信任和/或特定权限下运行控件,而页面在完全信任下运行?

反之亦然,例如UntrustedAssembly.Web.Controls.SomePage动态加载TrustedAssembly.Web.Controls.MyControl,是否可以在页面在部分信任下运行时以完全信任的方式运行控件?

更新/仅供参考:这是.NET 4

0 投票
1 回答
577 浏览

iis - Asp .Net 4.0 中的部分/完全信任模式验证

我在 Msdn 的论坛上发现了类似的问题,但没有答案(你可以在这里查看).Net 4.0 带有过时的方法

作为替代,建议使用AppDomain.CurrentDomain.PermissionSet

但是PermissionSet也需要完全信任模式。

所以显而易见的问题 - 如果应用程序处于完全或中等信任模式下,如何在 Asp .Net 4.0 下检查?

0 投票
1 回答
220 浏览

appfabric - Windows Server AppFabric 缓存

我目前正在一个 ASP.NET MVC 站点上工作,我们必须在该站点上运行部分信任。现在,我在高度信任时遇到了连接到 AppFabric 的问题。完全信任运行时没有问题。我的 web_hightrust.config 文件中需要什么权限。

失败的方法如下所示:

如您所见,我已经用我认为应该足以建立连接的方法对该方法进行了注释,但它失败了。

任何想法表示赞赏。

0 投票
1 回答
973 浏览

asp.net - 我可以通过仅部署 DLL 在中等信任环境中使用 SQL Server CE

我编写了一个使用 SQL Server CE 4.0 数据库的 ASP.NET 4.0 应用程序。这一切都在我的开发环境中使用中等信任(与主机相同的信任配置)。在这台机器上,我已经完成了安装过程(下载并安装了 MSI)。我现在正在尝试将此解决方案部署到我的网络托管服务商。

正在运行的代码是(这是 Altairis Membership Provider 的直接副本:

在上面的例子中,dbDbConnection,并且cmdDbCommand

我收到以下错误:

[InvalidOperationException:无法在安全透明方法中执行 CAS 断言] System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 create) +0
System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark) +61
System.Security.CodeAccessPermission.Assert() +28
System.Data.SqlServerCe.KillBitHelper.GetKillBit() +231
System.Data.SqlServerCe.KillBitHelper..cctor() +56

[TypeInitializationException:'System.Data.SqlServerCe.KillBitHelper' 的类型初始化程序引发异常。]
System.Data.SqlServerCe.KillBitHelper.ThrowIfKillBitIsSet() +0
System.Data.SqlServerCe.SqlCeProviderFactory..cctor() +41

[TypeInitializationException:'System.Data.SqlServerCe.SqlCeProviderFactory' 的类型初始化程序引发了异常。]

[TargetInvocationException: 调用目标抛出异常。]
System.RuntimeFieldHandle.GetValue(RtFieldInfo field, Object instance, RuntimeType fieldType, RuntimeType declaringType, Boolean& domainInitialized) +0
System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency) +180
System.Reflection.RtFieldInfo.GetValue(Object obj) +8
System.Data.Common.DbProviderFactories.GetFactory(DataRow providerRow) +232
System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +88
DatabaseExtensionMethods.cs:19 中的 Altairis.Web.Security.DatabaseExtensionMethods.CreateDbConnection(ConnectionStringSettings 设置)
TableMembershipProvider.cs:361 中的 Altairis.Web.Security.TableMembershipProvider.ValidateUser(字符串用户名,字符串密码)

我使用反编译器查看代码,似乎 SQL Server CE 的内部正在寻找注册表项,然后尝试执行代码Assert()

是否可以通过仅\bin部署 DLL 在部分信任环境中使用 SQL Server CE 4.0?

0 投票
3 回答
815 浏览

.net - 为什么我不能订阅部分信任 AppDomain 中的事件?

在我的默认(完全信任)AppDomain 中,我想创建一个沙盒 AppDomain 并订阅其中的事件:

订阅失败并显示消息“请求'System.Security.Permissions.ReflectionPermission, mscorlib, Version=4.0.0.0...'类型的权限失败。”

(关于 AppDomainStarter 的定义,见我对另一个问题的回答。)

请注意,ApplicationBase C:\Temp不是包含包含域的程序集的文件夹。这是故意的;我的目标是在新的 AppDomain 中加载第二个第 3 方不受信任的程序集,第二个程序集位于 C:\Temp (或其他任何地方,甚至可能是网络共享)。但在我可以加载第二个程序集之前,我需要Domain在新的 AppDomain 中加载我的类。这样做会成功,但由于某种原因,我无法跨 AppDomain 边界订阅事件(我可以调用方法,但不能订阅事件)。

更新:显然,当订阅沙盒 AppDomain 中的事件时,订阅者方法和包含订阅者的类都必须是公共的。例如:

但是,我仍然无法订阅该活动。新错误是“无法加载文件或程序集 'TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。”

在某种程度上,这是有道理的,因为我将“错误”文件夹“C:\Temp”指定为我的新 AppDomain 的 ApplicationBase,但在某种程度上这没有任何意义,因为“TestApp”程序集已经加载到两个 AppDomain 中. CLR 怎么可能找不到已经加载的程序集?

此外,如果我添加访问包含我的程序集的文件夹的权限也没有区别:

我可以使用不同的值来“修复”问题AppDomainSetup.ApplicationBase

这消除了异常,但我不能使用这个“解决方案”,因为 AppDomain 的目的是从与包含我自己的程序集的文件夹不同的文件夹中加载不受信任的程序集。因此,loc必须是包含不受信任程序集的文件夹,而不是包含我的程序集的文件夹。

0 投票
1 回答
206 浏览

.net-4.0 - 用于部分信任应用程序的 NGen

我有一个 .Net 4.0 应用程序,我需要提高在部分信任环境中运行的代码的性能。具体来说,我想消除运行时 JIT 的需要。通常这是使用 NGEN ( http://http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.100).aspx ) 完成的,但这不适用于以部分信任运行的程序集. 我还有其他选择吗?

0 投票
1 回答
172 浏览

wpf - XBAP - 我可以只对特定方法授予完全信任吗?

我正在考虑将 XBAP 用于 Intranet 应用程序,并且我想避免将整个应用程序设置为完全信任。

从本质上讲,我需要进行一些需要完全信任的方法调用(例如 DriveInfo.GetDrives),但我想以部分信任的方式运行应用程序的其余部分,因为它不需要完全信任 99应用程序的百分比。

有没有办法完全信任特定的方法调用和/或将需要完全信任权限的部分分解到不同的程序集中,以便我可以将大部分应用程序保持在部分信任状态?

谢谢!