.net - 创建自定义 CodeAccessSecurityAttribute 会导致编译异常

标签 .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 类的公共(public)端,但我不知道如何制作它,以便我可以使用 A 类方法而不是 B 类方法来执行此操作.

最佳答案

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

Notes to Inheritors

All permission attributes derived from this class must have only a single constructor that takes a SecurityAction as its only parameter.

修改:此要求的原因是,从低级 View 来看,CodeAccessSecurityAttribute 与其他自定义属性有很大不同。通常,自定义属性存储在 CustomAttribute 表中的已编译元数据中。但派生自 SecurityAttribute 的安全属性单独存储在 DeclSecurity 表中。而且该表并不像 CustomAttribute 表那样包含一般数据,该表包含 Action 的值、属性类型的名称以及自定义属性中的一组属性(命名参数)属性案例。因此,编译器需要将通用自定义属性语法转换为该元数据表中的条目,因此需要它遵循上述固定形式。 (另请参阅 this blog post 或第 II 部分,公共(public)语言基础设施 (CLI) 标准的 22.11 DeclSecurity : 0x0E 部分。)

关于.net - 创建自定义 CodeAccessSecurityAttribute 会导致编译异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4995687/

相关文章:

.net - Visual Studio : Compiler Warnings and errors appear twice in different languages

obfuscation - 是否可以在 HHVM 下隐藏源?

.net - 如何将 NLog 目标配置为仅记录异常?

c# - 如何为依赖于其他服务或数据库的服务编写单元测试

c# - 事务应该处于 WCF 服务级别还是数据库访问级别?

c# - 处理 WCF 服务中的异常?

java - 在 Java 中设置系统属性或添加参数更安全

.net - 方法访问异常

c# - MATLAB/.NET Interop - 不允许在 .NET 对象上设置属性

c# - 如何在 WCF 服务中使用 CefSharp?