以下内容转载自:http://blog.csdn.net/dongma_yifei/article/details/1533124

CodeAccessSecurityAttribute 是 PrincipalPermissionAttribute 的父类,并且也是编译器和CLR都认识的一个框架类。

CodeAccessPermission 继承自 IPermission。

做权限验证工作的是 IPermission 接口的实现类,在CLR验证权限的时候会调用 IPermission 的 Demand() 方法。
IPermission 接口类的对象由 CodeAccessSecurityAttribute 实现类对象的 CreatePermission() 方法生成;
CreatePermission() 方法使用了工厂模式,用户可以在方法中返回一个实现了 IPermission 接口的类对象。

CodeAccessSecurityAttribute 和 CodeAccessPermission 都是抽象类,不能用来生成对象,用户必须定义自己的继承类来实现。

编译器发现标记了 CodeAccessSecurityAttribute 的方法时,有以下几个处理步骤:
1.编译器扫描源代码,找出 CodeAccessSecurityAttribute 类型的特性;
2.编译器创建特性对象,并用源代码中特性标签所指定的属性值给特性对象赋值;
3.编译器调用特性对象的 CreatePermission() 方法,创建一个权限对象,将特性信息传递给它,然后将对象返回给编译器;
4.编译器调用权限对象的 ToXml() 方法,获得一个SecurityElement对象;
5.编译器将 ToXml() 方法返回的对象转化为 XML 数据并存入应用的元数据。

在程序的执行期内,当CLR发现权限集信息后,它首先会使用其中的类型信息创建一个权限对象,然后CLR会调用权限对象的FromXml()方

法,同时传入方法元数据的XML数据,在权限对象属性都被赋值后,CLR将调用它的Demand()方法。



[AttributeUsage(AttributeTargets.Assembly |
                 AttributeTargets.Class |
                 AttributeTargets.Struct |
                 AttributeTargets.Constructor |
                 AttributeTargets.Method,
                 AllowMultiple=true, Inherited=false)]
public abstract class CodeAccessSecurityAttribute : SecurityAttribute
{
    // Constructors.
    internal CodeAccessSecurityAttribute()
            : base()
            {
                // Nothing to do here.
            }
    public CodeAccessSecurityAttribute(SecurityAction action)
            : base(action)
            {
                // Nothing to do here.
            }

}; // class CodeAccessSecurityAttribute


public interface IPermission : ISecurityEncodable
{
    IPermission Copy();

    IPermission Intersect(IPermission target);

    IPermission Union(IPermission target);

    bool IsSubsetOf(IPermission target);

    [DynamicSecurityMethodAttribute()]
    void Demand();
}


public abstract class CodeAccessPermission : IPermission
{
    // Constructor.
    protected CodeAccessPermission() {}

    // Assert permissions for the caller.
    public void Assert()
    {
        if(!ClrSecurity.Assert(this, 1))
        {
            throw new SecurityException
                (_("Exception_SecurityNotGranted"));
        }
    }

    // Deny permissions to the caller.
    public void Deny()
    {
        ClrSecurity.Deny(this, 1);
    }

    // Convert this object into a string.
    public override String ToString()
    {
        return ToXml().ToString();
    }

    // Convert an XML value into a permissions value.
    public abstract void FromXml(SecurityElement elem);

    // Convert this permissions object into an XML value.
    public abstract SecurityElement ToXml();

    // Implement the IPermission interface.
    public abstract IPermission Copy();
    public void Demand()
    {
        if(!ClrSecurity.Demand(this, 1))
        {
            throw new SecurityException
                (_("Exception_SecurityNotGranted"));
        }
    }
    public abstract IPermission Intersect(IPermission target);
    public abstract bool IsSubsetOf(IPermission target);
    public virtual IPermission Union(IPermission target)
    {
        return null;
    }
}; // class CodeAccessPermission

应用框架的设计与实现——.NET平台(10 授权服务.CodeAccessSecurityAttribute)的更多相关文章

  1. [连载]《C#通讯(串口和网络)框架的设计与实现》- 9.插件引擎设计

    目       录 第九章           插件引擎设计... 2 9.1           框架的契约-接口... 2 9.2           插件的雏形-抽象类... 3 9.3     ...

  2. [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍

    [连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目       录 第一章           通讯框架介绍... 2 1.1           通讯的本质... 2 1 ...

  3. [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计

    目       录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章           框架总体的设计... 2 2.1           ...

  4. Java日志系统框架的设计与实现

    推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...

  5. 玩转OneNET物联网平台之MQTT服务⑤ —— OneNet智能灯+MVP框架

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  6. Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

    Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台:   微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...

  7. 《手把手教你》系列基础篇(九十六)-java+ selenium自动化测试-框架之设计篇-跨浏览器(详解教程)

    1.简介 从这一篇开始介绍和分享Java+Selenium+POM的简单自动化测试框架设计.第一个设计点,就是支持跨浏览器测试. 宏哥自己认为的支持跨浏览器测试就是:同一个测试用例,支持用不同浏览器去 ...

  8. Mybatis原理分析之二:框架整体设计

    1.引言 本文主要讲解Mybatis的整体程序设计,理清楚框架的主要脉络.后面文章我们再详细讲解各个组件. 2.整体设计 2.1 总体流程 (1)加载配置并初始化       触发条件:加载配置文件 ...

  9. activiti5.13 框架 数据库设计说明书

    转载自:http://www.cnblogs.com/llzgzljl/p/3356108.html activiti5.13 框架 数据库设计说明书 1.结构设计 1.1.    逻辑结构设计 Ac ...

随机推荐

  1. SQL Server常用技巧

    1:在SQL语句中,将存储过程结果集(表)存入到临时表中 insert into #tmp EXEC P_GET_AllChildrenComany '80047' 说明:#tmp要提前创建好 2:字 ...

  2. set QUOTED_IDENTIFIER ON事故记录

    作业执行失败: 看了一下执行脚本 delete  top(8000) from "interface"."完成" where  loggid in( selec ...

  3. VBS 相关知识 笔记

    1.Option Explicit: 必须声明了变量之后才能赋值.  原话:语句在模块级别中使用,强制显式声明模块中的所有变量. w3scholl看到的内容: 变量声明 您可以使用 Dim.Publi ...

  4. Nginx编译参数大全 configure参数中文详解

    ./configure --help--help 显示本提示信息--prefix=PATH 设定安装目录--sbin-path=PATH 设定程序文件目录--conf-path=PATH 设定配置文件 ...

  5. 一段防盗连的PHP代码

    $ADMIN[defaulturl] = http://www.163.com/404.htm;  //盗链返回的地址  $okaysites = array("http://www.163 ...

  6. TinyXML:一个优秀的C++ XML解析器

    //-------------------------------------------------------------------------------------------------- ...

  7. Spring3 url匹配规则

    Spring3 url匹配规则 Wildcard Description ? 匹配任何单字符 * 匹配0或者任意数量的字符 ** 匹配0或者更多的目录 宝贝网址:

  8. js中this对象,call,apply

  9. Mac OS 配置PHP + mysql 环境

    PHP:使用mac自带的环境.需要在配置文件中打开php模块. IDE使用的是phpstrom,JetBrain公司的神器. Mysql: 使用的是官网 Server version: 5.7.17. ...

  10. 开源PLM软件Aras详解一 安装

    对于Aras,一定很多人陌生,Aras Innovator是开源的PLM系统,优点就是免费license,没有节点限制,最棒的是基于SOAP,扩展性非常强,但是国内很多想入手的人入门很难, 关于Ara ...