以下内容转载自: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. 使用CodeSmith快速生成映射文件和映射类

    一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来 ...

  2. PHP超时处理全面总结

    [ 概述 ] 在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景: 1. 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现 2. 为了保证Web服务器不会因为当个页面 ...

  3. Using AFNetWorking 2.0 upload file to php web service server based on Slim

    Recently i am developing the IOS app, a feature is needed to upload image to the webservice server. ...

  4. WPF TextBlock文本纵向排列

    一.将TextBlock文本纵向排列输出有两种模式. 1.文字正常放置,只是纵向排列. 2.文字同样旋转90度,纵向排列. 二.详见下文实例 1.文本正常放置,纵向排列. (1)后台代码 string ...

  5. COM的永久接口

    COM的永久接口

  6. Howto: 如何将ArcGIS Server缓存移动到新服务器

     Howto: 如何将ArcGIS Server缓存移动到新服务器 文章编号: 33686 软件: ArcGIS Server 9.2, 9.3, 9.3.1 操作系统: Windows 2000, ...

  7. 关于 NPOI 报 Invalid column index (256). Allowable column range for BIFF8 is (0..255) or ('A'..'IV') 错误的解决办法

    当看到这个错误的时候,网上搜索可以会有些说列数有限制之类的说法,这个说法是相对于 Office 2003 的,在 Office 2007 之前,最多只可以创建  列:在 Office 2007 之后, ...

  8. Allegro转换PADS终极篇(转载)

    Allegro转换PADS终极篇.....http://www.eda365.com/forum.php?mod=viewthread&tid=86947&fromuid=190625 ...

  9. 解决maven依赖传递中的版本冲突问题

    通常情况下,我们都比较喜欢使用maven进行项目管理,要加个依赖包也非常简单,不需要到处去下载jar包,当然除了maven之外,也还有一些非常不错的工具.在使用maven进行项目依赖管理的时候,有时候 ...

  10. 写shell脚本速查笔记

    linux shell脚本的语法蛋疼,而且对于java开发人员来说又不常用,常常是学了一次等到下次用的时候又忘记了.因此制作这个速查笔记,用于要写shell脚本时快速回忆&速查. 获取当前脚本 ...