创建自定义CodeAccessSecurityAttribute会导致编译时出现异常

时间:2011-02-14 18:13:23

标签: .net wcf code-security

我正在构建一个自定义CodeAccessSecurityAttribute来处理我的WCF服务的授权。我这样建了A级:

public class A : CodeAccessSecurityAttribute
{
    public A() : base(SecurityAction.Demand)
    {
        // Constructor Code
    }

    public override IPermission CreatePermission()
    {
        // Permission Creation Code
    }

}

在编译时会产生此错误。

Error emitting 'A' attribute -- 'Serialized security custom attribute is 
truncated or incorrectly formed.'

在玩了一点之后,我想出了下一个编译没有错误的样本:

public class B : CodeAccessSecurityAttribute
{
    public B(SecurityAction Action) : base(Action)
    {
        // Constructor Code
    }

    public override IPermission CreatePermission()
    {
        // Permission Creation Code
    }

}

我知道这是因为SecurityAction枚举没有直接引用到A类的公共端,但是我无法弄清楚如何制作它以便我可以使用A类方法代替B类

2 个答案:

答案 0 :(得分:11)

我不知道要求的确切原因,但MSDN documentation on CodeAccessSecurityAttribute明确说明

  

对继承者的说明

     

从此类派生的所有权限属性必须只有一个构造函数,该构造函数将SecurityAction作为其唯一参数。

已修订:此要求的原因是CodeAccessSecurityAttribute从低级别视图与其他自定义属性完全不同。通常,自定义属性存储在CustomAttribute表中的已编译元数据中。但是,源自SecurityAttribute的安全属性将单独存储在DeclSecurity表中。此表不包含CustomAttribute表之类的常规数据,此表包含Action的值,属性类型的名称,以及自定义属性案例中的一组属性(命名参数)。因此,编译器需要将常规自定义属性语法转换为此元数据表中的条目,因此需要它遵循上面提到的固定形式。 (另请参阅{em>公共语言基础结构(CLI)标准的this blog post或Partition II, 22.11 DeclSecurity:0x0E 部分。)

答案 1 :(得分:3)

如果为构造函数提供默认值,则不必在属性中指定它。

public class B : CodeAccessSecurityAttribute 
{ 
    public B(SecurityAction Action = SecurityAction.Demand) : base(Action) 
    { 
        // Constructor Code 
    } 

    public override IPermission CreatePermission() 
    { 
        // Permission Creation Code 
    } 
}