应用框架的设计与实现——.NET平台(10 授权服务.CodeAccessSecurityAttribute)

以下内容转载自: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

时间: 2024-10-11 01:20:00

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

框架模块设计经验总结

转自:http://www.cnblogs.com/zgynhqf/archive/2011/07/15/2107593.html 这是原创,尊重原创............ 框架模块设计经验总结 三个月没写日志了,比较懒散--下半年准备做OEA 的 B/S 版本,比较复杂,需要从架构设计开始认真入手.正好今天到了部门反思的时间,今天先把原来的一些设计经验总结一下,以方便将来回顾. 直入主题,这篇日志主要用于总结一些框架级别的模块设计经验. 总述 一个大型的框架,必然由多个较独立的子系统/子模块

探讨插件式GIS框架的设计

三年前,听当时的师兄推荐,买了蒋波涛的一本关于GIS插件框架的书.当时一边看书一边将其中的例子完整的实现了一遍,收益匪浅.后来由于项目需要,也做过一个插件的C/S系统,用的是微软提供的MEF框架.在这个系统中,把蒋波涛在他的书中没有涉及到的插件和插件的通信完成了.不过,蒋波涛的那本书,涉及到了插件系统的很多底层内容,其中关于插件引擎的设计尤其值得学习.近来,我将自己当年实现的那个例子进行了一个总结,和大家一起分享. 1.插件式框架的组成 (1).框架分为宿主程序和插件对象两部分 (2).两部分交

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

推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程序状态记录.数据恢复等功能有重要作用 日志系统一般作为服务进程或者系统调用存在,我们一般程序中使用系统调用 常用日志系统包括log4j的简单介绍 日志系统的系统架构 日志系统的信息分级 日志输出的设计 下面是全文的引用: 在Java领域,存在大量的日志组件,open-open收录了21个日志组件.日

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

目       录 第九章           插件引擎设计... 2 9.1           框架的契约-接口... 2 9.2           插件的雏形-抽象类... 3 9.3           实现接口... 4 9.4           反射机制... 5 9.5           反射工具类... 8 9.6           小结... 9 第九章     插件引擎设计 在介绍<第10章 宿主程序详细设计>之前对接口和插件的相关内容进行一下整体介绍,在设计宿主程

网络框架重构设计

一.背景 网络管理层是各上层业务都要用到的层级,为提供更高效率.更高质量的服务,需对网络服务层进行重构. 二.重构目标 1.提供连接管理 在App整个运行过程中,始终向上层业务提供两条有效的长连接(云端连接和路由器连接),并支持在网络断开.心跳失败后的重连机制. 2.自动登陆(已实现) 在长连接重建后, 自动登陆服务器. 3.自动同步(已实现) 在长连接重建后.并自动登陆服务器后, 自动同步本地信息到云平台/路由器. 4.网络服务代理层RemoteProxy RemoteProxy作为对上层业务

我们一起完成插件框架的设计与实现

原文:我们一起完成插件框架的设计与实现 开场一些题外话,今天登陆这个"小菜"的博客园,感触颇多."小菜"是我以前在QQ群里面的网名,同时也申请了这个博客园账户,五年前的"小菜"在NET和C++某两个群里面非常的活跃,也非常热心的帮助网友尽能力所及解决技术上的问题.依稀记得当时NET群里面的"青菊.Allen.酷酷",C++群里面的"夏老师.风筝兄"等网友.哥们.时过境迁,后来因为某些原因而慢慢淡出了QQ群里

分布式架构设计之电商平台

分布式架构设计之电商平台 何为软件架构?不同人的答案会有所不同,而我认为一个好的软件架构除了要具备业务功能外,还应该具备一定的高性能.高可用.高伸缩性及可拓展等非功能需求.而软件架构是由业务架构和技术架构两部分组成,因为有了业务结构才会催生出软件架构,进而来满足业务上的需求,所以,在做软件架构设计时,需要分为业务架构设计和技术软件架构设计,二者不可分离哦!那么,接下来就以本人实际工作中的电商平台为例,进行说明电商平台架构设计,因为不同行业产品系统不同业务不同,而催生的系统软件的实现要求及架构设计

蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的Framework包括Android Framework.Linux QT.Windows MFC.应用框架抽象并封装实现了一般应用场景的需求,完成应用开发的80%,剩下的20%则以回调(callback)和接口的方式供应用开发人员调用以完成具体的需求. 一般Framework完成的工作包括:任务分

企业信息系统集成框架(设计思路)C++模式

设计要求: 1.企业信息系统框架.第三方产品通过接口层进行分层. 2.企业信息系统框架如何自由的继承第三方产品:通过一个抽象类.(软件设计要求:模块要求松,接口要求紧). 设计步骤: 1.报文的接受与发送抽象类: C++与C语言设计区别:C语言中有个句柄,原因是需要分配一个结构体资源,把发送和接受的信息存储起来.而C++中由于有类的存在,可以直接将这个句柄内容存储在子类中,不需要再单独设置. 2.测试界面面向抽象类框架集成,开始初步完成测试界面. 4.厂商的产品实现(自己的头文件和.cpp文件)