由于过时的CAS策略,寻求替代AppDomain.CreateDomain(字符串,证据)

Jes*_*lyn 11 c# privileges appdomain .net-4.0 code-access-security

我正在通过Microsoft .Net Framework - 应用程序开发基础培训工具包第8章第2课:配置应用程序域

ShowWinIni是我想要执行的程序的程序集名称

object[] hostEvidence = { new Zone(SecurityZone.MyComputer) };
Evidence e = new Evidence(hostEvidence, null);

// Create an AppDomain.
AppDomain d = AppDomain.CreateDomain("New Domain", e);

// Run the assembly
d.ExecuteAssemblyByName("ShowWinIni");
Run Code Online (Sandbox Code Playgroud)

当我执行:

AppDomain d = AppDomain.CreateDomain("New Domain", e);
Run Code Online (Sandbox Code Playgroud)

我收到以下消息:"此方法隐式使用CAS策略,已被.NET Framework废弃.为了兼容性原因启用CAS策略,请使用NetFx40_LegacySecurityPolicy配置开关.请参阅http://go.microsoft .com/fwlink /?LinkID = 155570了解更多信息."

当我创建一个没有Evidence对象的AppDomain时,我可以正常执行程序集.

当然,我访问过http://go.microsoft.com/fwlink/?LinkID=155570,但我仍然对如何创建具有指定权限的应用程序域感到困惑.

我找到的下一个最有用的网站是http://msdn.microsoft.com/en-us/library/bb763046.aspx但我的StrongName对象计算为NULL.

StrongName fullTrustAssembly =
     typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>();
Run Code Online (Sandbox Code Playgroud)

程序是实现所有这些代码的类的名称.

提前感谢您的建议和提示!

Jes*_*lyn 11

我找到了一种方法来使原始代码示例工作,而无需启用NetFX40_LegacySecurityPolicy.

EvidenceBase[] hostEvidence = { new Zone(SecurityZone.MyComputer) };
Evidence e = new Evidence(hostEvidence, null);

AppDomain d = AppDomain.CreateDomain("New Domain", e);

d.ExecuteAssemblyByName("ShowWinIni");
Run Code Online (Sandbox Code Playgroud)

如果您将SecurityZone更改为Internet,它将无法使用,它将尝试使用过时的CAS安全策略,从而导致NotSupportedException.我想要的是SecurityException ...意味着我想要执行的程序集没有它需要的权限.

要在具有受限权限的AppDomain中执行程序集,您需要使用沙盒.我找到的最好的沙盒示例如下:http: //www.simple-talk.com/dotnet/.net-framework/whats-new-in-code-access-security-in-.net-framework-4.0- --Part-I /

我认为该页面也很好地解释了对4.0中CAS的更改!

许多来源,包括MSDN,让我确信在调用时我需要提供一个StrongName数组:

AppDomain.CreateDomain( string friendlyName,
                        Evidence securityInfo,
                        AppDomainSetup info,
                        PermissionSet grantSet,
                        params StrongName[] fullTrustAssemblies);
Run Code Online (Sandbox Code Playgroud)

正如我原来的帖子所述,我(现在仍然)在获取StrongName对象时遇到了麻烦null.事实证明我甚至不需要它!

这是我完成的沙盒示例:

Evidence ev = new Evidence();
ev.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev);

AppDomainSetup adSetup = new AppDomainSetup();
adSetup.ApplicationBase = Path.GetFullPath(pathToUntrusted);

AppDomain newDomain = AppDomain.CreateDomain("Sandbox Domain", null, adSetup, internetPS);

newDomain.ExecuteAssemblyByName(untrustedAssembly);
Run Code Online (Sandbox Code Playgroud)

pathToUntrusted =我的程序集的文件路径的字符串表示形式

untrustedAssembly =程序集名称的字符串表示形式


Jes*_*lyn 7

在寻求同事的帮助后,我得到了这个工作.

显然,这本书的练习是为了在.Net的3.5框架中使用而设计的,而我使用的是4.0.修改我的项目和ShowWinIni项目属性以使用3.5框架后,一切正常......但我仍然希望使用4.0框架.

要解决以下消息:"此方法隐式使用CAS策略,该策略已被.NET Framework废弃.为了兼容性而启用CAS策略,请使用NetFx40_LegacySecurityPolicy配置开关.请参阅http://go.microsoft .com/fwlink /?LinkID = 155570了解更多信息."

我创建了一个app.config文件并添加了以下内容:

<configuration>
   <runtime>
      <NetFx40_LegacySecurityPolicy enabled="true"/>
   </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

您可以在http://msdn.microsoft.com/en-us/library/dd409253.aspx上阅读有关NetFx40_LegacySecurityPolicy的更多信息.

这最终使我的程序成为一个不受信任的应用程序,当我尝试调试时抛出一个安全异常.为了使我的应用程序再次可靠,我启用了ClickOnce安全设置,并在项目的属性中标记了"这是一个完全信任的应用程序".

此时,我可以调试我的程序,但是当我执行此语句时,现在抛出了一个Security Exception:

d.ExecuteAssemblyByName("ShowWinIni");
Run Code Online (Sandbox Code Playgroud)

在我创建AppDomain对象时,在开始尝试包含Evidence对象之前,此语句运行正常.好吧,事实证明还有另一种方法... AppDomain.ExecuteAssemblyByName(字符串,证据),您可以在http://msdn.microsoft.com/en-us/library/5kd4z003.aspx上阅读.所以我用以下内容替换了上面的代码片段:

d.ExecuteAssemblyByName("ShowWinIni", e);
Run Code Online (Sandbox Code Playgroud)

'e'是我原始问题中创建的Evidence对象.

现在我不认为这是最好的解决方案.理想情况下,我宁愿不强迫我的程序使用NetFx40_LegacySecurityPolicy,我相信真实世界的应用程序不应该依赖于过时的方法.如果有人和我一起工作,我认为这个解决方案值得发布.