securitymanager.policyhierarchy()已经过时,它的替代品是什么?

use*_*032 5 .net c# mono

SecurityManager.PolicyHierarchy()会生成一个关于过时的警告,但在用于比较接收和当前策略级别时,我无法找到替换它的方法或如何替换它.

例如

SecEnumerator levelEnumerator = SecurityManager.PolicyHierarchy();
while (levelEnumerator.MoveNext())
{
 PolicyLevel Seclevel = levelEnumerator.Current as PolicyLevel;
 if (Seclevel == Init.Seclevel)
 {
      return;
 }
}
Run Code Online (Sandbox Code Playgroud)

对于这样的应用,现在应该使用其他方法吗?

Sor*_*ati 4

没有替代品。

正如您在 MSDN 的文档页面中看到的SecurityManager,所有与策略相关的方法都已过时。原因是策略现已从 CAS 中删除(嗯,自 .Net4 以来)。要在此处阅读有关此检查的更多信息:

代码访问安全性变更摘要

话虽这么说,在此警告的描述中,有一个很好的链接,它为您提供了更改代码所需的必要信息并建议可能的替代方案:

代码访问安全策略兼容性和迁移

迁移:替换过时的调用

为了更好地帮助您,我们需要知道您到底想在这里实现什么目标。描述您的目标,我们也许可以建议替代方案或替代方案。


根据您的评论,您似乎要做的是将一段用户插入的代码(如您所说)沙箱化并限制其访问。这不是 CAS 应该用来做的事情。事实上,这里有关于此类用法的明确警告

.NET Framework 中的代码访问安全性不应用作基于代码起源或其他身份方面强制执行安全边界的机制。

您的代码可能应该进行重构,以使用该方法提供的Evidence(强名称或 url 等)检索一段代码所需的权限SecurityManager.GetStandardSandbox(Evidence),然后使用返回的权限在新的沙盒 AppDomain 中加载程序集方法CreateDomain(String, Evidence, AppDomainSetup, PermissionSet, StrongName[])。您还可以在创建新域之前更改这些权限,以便更好地控制代码的执行。以下文章可以帮助您重构您的应用程序:

如何:在沙箱中运行部分受信任的代码

换句话说,不再有策略,但您可以在特定的PermissionSet.