了解.NET';s";“证券行动”;权限的参数

了解.NET';s";“证券行动”;权限的参数,.net,security,permissions,.net,Security,Permissions,有人能解释SecurityAction枚举值的含义和用途吗 MSDN页面不是非常清晰。它说LinkDemand发生在即时编译中,而Demand发生在运行时 为什么会有这种区别?在什么情况下我会使用LinkDemand而不是Demand 同样,其他有趣的值(如InheritanceDemand、Assert和PermitOnly)的用例是什么。LinkDemand基本上要求调用代码具有指定的权限。另一方面,Demand不仅要求调用代码具有指定的权限,还要求调用调用代码的代码以及调用该代码的代码,依

有人能解释SecurityAction枚举值的含义和用途吗

MSDN页面不是非常清晰。它说LinkDemand发生在即时编译中,而Demand发生在运行时

为什么会有这种区别?在什么情况下我会使用LinkDemand而不是Demand


同样,其他有趣的值(如InheritanceDemand、Assert和PermitOnly)的用例是什么。

LinkDemand基本上要求调用代码具有指定的权限。另一方面,Demand不仅要求调用代码具有指定的权限,还要求调用调用代码的代码以及调用该代码的代码,依此类推,一直到堆栈上(或者直到找到断言为止;请参见下文)

LinkDemand可以在JIT编译时强制执行,因为如果JIT编译器命中使用LinkDemand调用方法的语句,它可以立即确定调用代码是否具有权限。每次调用该方法时,都必须在运行时强制执行请求,因为在编译时不可能知道在任何给定调用期间堆栈上会出现什么。因此,LinkDemand的效率要高得多。然而,这种效率的权衡是安全性较低。使用LinkDemand,您相信调用代码不会让其调用代码(可能有权限也可能没有权限)将其用于恶意目的。(换句话说,您相信调用代码中没有安全漏洞,调用方可以利用这些漏洞通过LinkDemand间接访问方法。)使用Demand,您知道堆栈上的每个人都绝对有权限(至少在找到断言之前),因此不受信任的调用方不会有任何风险

Assert基本上是对需求的短路。如果堆栈上的调用方具有活动的断言(换句话说,只有堆栈中直到断言的调用方必须具有该权限),则对请求进行的安全检查将停止。因此,与LinkDemand一样,您必须相信带有断言的代码不会被其调用方利用

Deny也是请求的短路,但它并没有断言权限,而是取消了调用方可能拥有的权限。您可以使用它来帮助防止可能的安全漏洞,方法是确保在调用过程中没有可能被利用的无关权限有效

PermitOnly与Deny类似,只是它拒绝了除指定权限之外的所有权限,而不是拒绝特定权限

InheritanceDemand与其他类不同,它与方法调用没有直接关系,但表示不具有该权限的类不能从具有InheritanceDemand的类继承。例如,这可以用来阻止不受信任的代码访问类的受保护成员,否则子类就可以访问这些成员