Silverlight 中使用安全关键构造函数对透明类型进行子类化的安全规则

Posted

技术标签:

【中文标题】Silverlight 中使用安全关键构造函数对透明类型进行子类化的安全规则【英文标题】:Security rules for subclassing transparent type with safe-critical constructor in Silverlight 【发布时间】:2011-10-01 10:17:15 【问题描述】:

在 Silverlight (v4.0) 安全模型中,Shawn Farkas says 派生自类型:

[...] 我们看到了 应用程序类型只能派生自 其他应用类型或透明 平台类型。 (*)

这里的*部分是:

(*) 这在 99.9% 的情况下是正确的。关于类的默认构造函数的可见性还有另一条规则(我们将在下周深入研究安全模型时介绍),它还要求基类的默认构造函数(如果有的话),也必须是透明的。实际上,您通常不会在没有透明默认构造函数的平台中找到有趣的透明类型,因此该规则通常不会发挥作用。

然而,有一种有趣的透明类型没有透明的默认构造函数——WebClient 类。还有一个很好的理由要对其进行子类化 - 重写 GetWebRequest 以提供对 cookie 的支持。

作为测试,我尝试了以下使用和不使用构造函数属性...

public class MyWebClient : WebClient

    [SecuritySafeCritical] // matches the attribute on the base class ctor
    public MyWebClient()  

...但无论哪种方式都会出现以下错误:

覆盖成员时违反了继承安全规则:“MyWebClient..ctor()”。重写方法的安全可访问性必须与被重写方法的安全可访问性相匹配。

在我看来,这就是他提到的 0.1% 的情况。不幸的是,据我所知,下一篇文章从未扩展过这里的规则。因此我有两个问题:

    有人知道这个 0.1% 规则是什么吗? 给定 1,是否可以从 Silverlight 4 中的 WebClient 派生?

【问题讨论】:

这很令人沮丧。该文档没有显示任何线索。您只有在实际尝试或通过反射器查看时才会发现。 【参考方案1】:

我对@9​​87654321@ 的回答涵盖了你的第 1 部分。

2 的答案是否定的,但对于 WebClient,如果您有某些理由,您可以创建自己的。

【讨论】:

以上是关于Silverlight 中使用安全关键构造函数对透明类型进行子类化的安全规则的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight 全局鼠标按下事件处理程序

C语言里面构造函数和析构函数的运用办法

c#中 new 这个关键字是啥意思

在构造函数中使用关键字“this”时定义复制构造函数

Java中this关键字在构造方法中的使用

Silverlight 安全问题:自签名证书