C#强化系列文章九:代码访问安全性使用

简介:

在.Net Framework中提供了代码访问安全性(Code Access Security),它的主要作用就是限制代码的使用权限。可以控制各种系统资源的访问权限、可以要求代码的调用方拥有特定的权限......。比如我们可以控制自己的dll只能在什么条件下由什么人调用,特别是在Asp.net中可以限制不同代码的安全权限,从源头限制住网络上的攻击等。

本文的主要内容如下:

1、在Asp.Net中使用自定义的信任级别

2、配置Sqlconnection的代码访问权限

3、实现和使用一个最简版的自定义权限

 

在Asp.Net中使用自定义的信任级别

Asp.Net默认在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config中配置了网站的信任级别: 
复制代码
       < securityPolicy >
        
< trustLevel  name ="Full"  policyFile ="internal" />
        
< trustLevel  name ="High"  policyFile ="web_hightrust.config" />
        
< trustLevel  name ="Medium"  policyFile ="web_mediumtrust.config" />
        
< trustLevel  name ="Low"  policyFile ="web_lowtrust.config" />
        
< trustLevel  name ="Minimal"  policyFile ="web_minimaltrust.config" />
      
</ securityPolicy >
      
< trust  level ="Full"  originUrl ="" />
复制代码
默认为Full,表示拥有最大的权限,当然风险也就最高,我们可以在自己的网站下的web.config中自定义信任级别:
         < securityPolicy >
            
< trustLevel  name ="Custom"  policyFile ="E:\_NetProject\PermissionTrust\WebSite11\web_customtrust.config" />
        
</ securityPolicy >
        
< trust  level ="Custom"  originUrl ="" />

这里使用了自定义的配置文件,其实也就是复制C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\web_lowtrust.config文件,然后在此文件上进行适当修改就可以了(使用此配置默认是不允许连接数据库的)

 

配置Sqlconnection的代码访问权限

配置的方法就是修改自定义的web_customtrust.config文件,修改后的文件如下所示:粗体部分为修改点

web_customtrust.config

加入以上的配置后限制使用SqlConnection时只能访问dbserver上的db1数据库,不能访问其他数据库,用户名密码等可以自由输入,也就是在代码中只能:

SqlConnection connection  =   new  SqlConnection( " data source=dbserver;User ID=gspring;Password=***;initial catalog=db1 " )

如果连接其他数据库就会报错:

说明: 应用程序试图执行安全策略不允许的操作。要授予此应用程序所需的权限,请与系统管理员联系,或在配置文件中更改该应用程序的信任级别。 
异常详细信息: System.Security.SecurityException: 请求“System.Data.SqlClient.SqlClientPermission, System.Data, Version
= 2.0 . 0.0 , Culture = neutral, PublicKeyToken = b77a5c561934e089”类型的权限已失败。

这样就从源头上限制住了数据库的连接操作。

当然如果希望可以连接任意数据库,可以修改为如下配置:

< IPermission  class ="SqlClientPermission"  version ="1"  Unrestricted ="true" />

 

实现和使用一个最简版的自定义权限

自定义一个代码访问权限需要从CodeAccessPermission继承,并且要实现IUnrestrictedPermission接口,主要需实现的方法有:

Copy 创建当前权限对象的副本。
Intersect 返回当前类与传递的类所允许权限的交集。
IsSubsetOf 如果传递的权限包括当前权限允许的一切操作,则 IsSubsetOf 返回 true。
FromXml 对您的自定义权限的 XML 表示形式进行解码。
ToXml 对您的自定义权限的 XML 表示形式进行编码。
Union 创建一个权限,该权限是当前权限与指定权限的并集。

复制代码
  1 using  System;
  2 using  System.Text;
  3 using  System.Security;
  4 using  System.Security.Permissions;
  5
  6 namespace  MyPermission
  7 {
  8    [Serializable]
  9    public sealed class CustomPermission : CodeAccessPermission, IUnrestrictedPermission
 10    {
 11        private DateTime _expiredDate;
 12
 13        public DateTime ExpiredDate
 14        {
 15            get return _expiredDate; }
 16            set { _expiredDate = value; }
 17        }

 18
 19        public CustomPermission()
 20        {
 21        }

 22
 23        //必须有这个方法,CAS系统会调用此方法的
 24        public CustomPermission(PermissionState state)
 25        {
 26        }

 27
 28        public bool IsUnrestricted()
 29        {
 30            return false;
 31        }

 32
 33        public override IPermission Copy()
 34        {
 35            CustomPermission copy = new CustomPermission();
 36            copy.ExpiredDate = this.ExpiredDate;
 37
 38            return copy;
 39        }

 40
 41        public override IPermission Intersect(IPermission target)
 42        {
 43            if (null == target)
 44            {
 45                return null;
 46            }

 47            else
 48            {
 49                return target;
 50            }

 51        }

 52
 53        private bool CheckDate(DateTime date)
 54        {
 55            if (System.DateTime.Now.CompareTo(date) < 0)
 56            {
 57                return true;
 58            }

 59            else
 60            {
 61                return false;
 62            }

 63        }

 64
 65        /// <summary>
 66        /// 进行权限判断
 67        /// </summary>
 68        /// <param name="target"></param>
 69        /// <returns></returns>

 70        public override bool IsSubsetOf(IPermission target)
 71        {
 72            if (null == target)
 73            {
 74                return false//为false时,指示条件不满足,需要读取config中配置来判断
 75            }

 76            try
 77            {
 78                CustomPermission passedpermission = (CustomPermission)target;
 79
 80                return CheckDate(passedpermission.ExpiredDate);
 81            }

 82            catch (InvalidCastException)
 83            {
 84                throw new ArgumentException("Argument_WrongType"this.GetType().FullName);
 85            }

 86        }

 87
 88        public override void FromXml(SecurityElement PassedElement)
 89        {
 90            string element = PassedElement.Attribute("expireddate");
 91
 92            if (null != element)
 93            {
 94                this.ExpiredDate = Convert.ToDateTime(element);
 95            }

 96        }

 97
 98        public override SecurityElement ToXml()
 99        {
100            SecurityElement element = new SecurityElement("IPermission");
101            Type type = this.GetType();
102            StringBuilder AssemblyName = new StringBuilder(type.Assembly.ToString());
103            AssemblyName.Replace('\"''\'');
104            element.AddAttribute("class", type.FullName + "" + AssemblyName);
105            element.AddAttribute("version""1");
106            element.AddAttribute("expireddate"this.ExpiredDate.ToString());
107            return element;
108        }

109    }

110}
复制代码

 例子比较简单,就是读取配置中的过期时间进行判断,需要特别说明的地方有:

1、public CustomPermission(PermissionState state)这个构造函数必须要有,CAS内部会调用此方法

2、将程序集添加到受信任的程序集列表中,因为自定义权限将参与 .NET Framework 安全系统,所以它必须完全受信任。依次执行以下命令:

caspol -rf MyPermission.dll    --从策略级别移除完全信任程序集
gacutil -i MyPermission.dll     --注册GAC
caspol -af MyPermission.dll   --将完全信任程序集添加到策略级别

3、在将程序集加入GAC之后,会默认从GAC中读取dll信息,不会读取当前项目下新生成的dll,需要从GAC中把此DLL删除后才可以。ps:我当时在CustomPermission里面加入一个新的方法,结果在自己的网站下一直找不到,把GAC中的信息删除之后才能找到,不知道算不算VS2005的一个Bug

4、在MyPermission程序集的AssemblyInfo.cs文件中添加配置:

 

[assembly: AllowPartiallyTrustedCallers]

 要不然会报粗:该程序集不支持部分受信任的调用方

5、在web_customtrust.config文件中加入配置

    a、在SecurityClasses节点加入:

             < SecurityClass  Name ="MyPermission"  Description ="MyPermission.CustomPermission, MyPermission, Version=1.0.0.0, Culture=neutral, PublicKeyToken=97b2744b86090fe0" />

    b、在Name="ASP.Net"的PermissionSet节点加入:

< IPermission  class ="MyPermission"  version ="1"  expireddate ="2008-07-22" />

 

配置好之后就可以在代码中应有此安全策略了

复制代码

    private void Test()
    
{
        CustomPermission Perm 
= new CustomPermission();
        Perm.Demand();

          .......

          .......
    }

复制代码

这个是应用安全策略的一种方式,另外一种方式是使用声明式安全性,需要再定义一个属性类来支持,这里就不再详述了。

 

小结:总之代码访问安全性可以有效的限制代码的使用权限,本文的例子只是用来演示使用方法,实际应用会比这个复杂的多。比如在Sharepoint中可能允许客户上传自己的dll代码,客户的代码有可能调用系统资源和我们提供的共通代码,那么我们就可以通过代码访问安全性来限制客户代码可以访问哪些资源,可以调用哪些共通dll等。


    本文转自永春博客园博客,原文链接:http://www.cnblogs.com/firstyi/archive/2008/07/24/1250447.html,如需转载请自行联系原作者



相关文章
|
5月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
539 27
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
725 2
|
12月前
|
SQL 安全 API
C# 一分钟浅谈:GraphQL 安全性考虑
本文探讨了在 C# 中实现安全的 GraphQL API 的方法,重点讨论了常见的安全问题及其解决方案,包括过度获取数据、深度嵌套查询、认证与授权、SQL 注入和 DDoS 攻击。通过合理的字段限制、批处理查询、JWT 认证、参数化查询和速率限制等手段,可以有效提升 API 的安全性和性能。
253 22
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
321 2
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
711 6
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
154 0
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
200 0
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
282 0
|
3月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
192 19
|
4月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
569 0

热门文章

最新文章