这文章会向你展示, 怎么配置ASP.NET Web应用程序, 使之运行在medium trust.
如果你的服务器有多个应用程序, 你可以使用code access security和medium trust级别去隔离应用程序
通过设置和锁定machine级别的Web.config的信任级别, 你可以为服务器的Web应用程序建立安全策略.
运行ASP.NET的medium trust, 2.0比1.1较容易的, 因为当使用ASP.NET 2.0, 你不得不访问MS SQL Server 数据库的medium trust
Medium trust也为共享服务资源和相互的应用程序提供了强制性隔离环境.
Medium trust应用程序执行不注册访问, 不记录访问及不能使用反射.
你定义了<<trust/>>元素, Web访问网络地址是受限的,文件系统访问应用程序的虚拟目录层次也是受限的. 如果medium trust策略太过于限制性, 你可以建立或使用自定义策略文件.
目的
· 学习怎么使用medium trust开发Web应用程序.
· 学习在ASP.NET 2.0中partial trust的Web应用程序和了解变化
· 学习关于,当时用 medium trust 级别是的强制性.
· 在你的Web应用程序中配置 medium trust 级别
· 建立你自己的自定义信任级别和编辑信任级别
概述
默认, ASP.NET2.0 Web应用程序和Web服务是full trust的, 应用程序可以执行特许操作和访问资源, 甚至是操作系统暗转性和Windows访问控制列表(ACLs)
为ASP.NET应用程序设置访问及操作级别, 使它在主机环境中受隔离, 你可以使用code access security 去限制资源, 从中可以控制应用程序访问性和权限操作. 你通过配置<trust>元素如下:
<trust level="Full|High|Medium|Low|Minimal" />
<trust>元素支持许多默认的信任级别. 每个级别在为你的应用程序的运行, 连续提供了一个更加多限制性的环境(更少的code access security权限)
ISPs 需要在主机中建立多个应用程序, 使不同公司的应用程序在频繁使用中不能互相访问数据或不能互相干扰, 需要设置medium trust 级别, Medium trust 设置也限制到共享系统资源, 使应用程序能够访问.
2.0的新特征之一
ASP.NET 1.1和2.0信任级别的主要不同如下:
- ASP.NET 1.1和2.0, medium trust 可以访问SQL数据库, 因为SQL管理数据provider是不要求full trust和在medium trust应用程序中产生了SqlClientPermission
- .NET Framework 2.0, Oracle.NET data provider, OLE DB.NET data provider, 和ODBC .NET data provider不再需要full trust. 它允许你使用partial trust去访问SQL Server和其他数据库. 使用在medium trust的应用程序的这些providers, 你需要自定义策略和准予适当的权限许可:例如,OraclePermission, OleDbPermission 或 OdbcPermission.
- 在2.0中, SmtpPermission是可以设置full, high和medium trust级别的. 这就允许应用程序发送e-mail.
- 在1.1, 你不得不准予代码 full trust去访问事件日志. 在2.0是不再需要的, 虽然你仍然必须建立custom trust策略文件去准予EventLogPermission,以下文档会详述.
Medium Trust 概要
主要在medium trust Web应用程序的限制性的放置是:
· OleDbPermission 不可用. 意思是你不可以用ADO.NET管理OLE DB data provider 去访问数据库.然而, 你可以使用受管理的SQL Server provider去访问SQL Server 数据库.
· EventLogPermission 不可用. 意思是你不可以访问Windows 时间日志.
· ReflectionPermission不可用. 意思是你不可以使用反射.
· RegistryPermission不可用. 意思是你不可以访问.
· WebPermission 有限制. 意思是你的应用程序可以只和地址或地址列通讯, 只需要定义<trust>元素.
· FileIOPermission有限制. 意思是你可以只在你的应用程序的虚拟目录层次里访问文件. 你应该为你的应用程序虚拟目录层级准予读、写, 附加, PathDiscovery 的权限许可.
非托管代码或using Enterprise Services, 你可以阻止.
步骤的概要
在ASP.NET应用程序中使用medium trust:
· 步骤1. 配置medium trust.
· 步骤2. 锁定trust级别.
· 步骤3. 随意地基于medium trust, 建立自定义策略
<trust level="Medium" originUrl="" />
步骤 1. 配置 Medium Trust
配置应用程序为medium trust, 添加如下的元素到每个应用程序的Web.config文件中,
<trust level="Medium" originUrl="" />
注意 如果呈现, originUrl 属性可以被权限许可所使用, 例如WebPermission, 限定连通性以定义一套地址. 在服务器配置所有Web应用程序, 以运行medium trust, 添加这个元素到machine级别Web.config文件中, 如下:%windir%/Microsoft.NET/Framework/{version}/CONFIG.
By default, Web applications are configured to run with full trust as shown in the following default configuration from the machine-level Web.config file.
默认, Web应用程序被配置运行full trust的machine级别Web.config文件, 如下:
<location allowOverride="true"> <system.web> <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="" /> </system.web> </location>
检查整套medium trust的权限许可能力, 可以查看Web_mediumtrust.config文件.
步骤 2. 锁定信任级别
应用程序服务providers或任何一个为同一个服务器运行多应用程序而提供在machine级别Web.config文件medium trust策略的设置和对信任级别的锁定
实现这个, 在machine级别的Web.config文件中设置allowOverride属性为false, 代码如下.
<location allowOverride="false"> <system.web> <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="Medium" originUrl="" /> </system.web> </location>
通过设置allowOverride="false", 个别的开发者是不可以在他们的应用程序的Web.config文件中覆盖medium trust 策略的.
步骤 3. 基于Medium Trust随便地建立自定义策略
如果medium trust是太过限制性的, 你可以基于medium trust建立自定义策略文件. 例如, 你可以允许应用程序去选择以下任何一种:连接到Oracle数据库, 写事件日志到Windows事件日志, 或者读应用程序虚拟目录层级以外的指定目录的文件.
基于medium trust建立自定义策略
1. 复制medium trust策略文件web_MediumTrust.config
位于%windir%/Microsoft.NET/Framework/{Version}/CONFIG. 并在同一目录下建立新的策略文件. 给它一个名字, 指出这是你所变更后的medium trust; 例如, 名字可以是: customeWeb_MediumTrust.config.
2. 添加一个你想准予的权限许可, 如下例子, FileIOPermission被编辑为允许读访问非应用程序的虚拟目录层级的指定目录.
<PermissionSet class="NamedPermissionSet" version="1" Name="ASP.Net"> ... <IPermission class="FileIOPermission" version="1" Read="C:/SomeDir;$AppDir$" Write="$AppDir$" Append="$AppDir$" PathDiscovery="$AppDir$" /> ... </PermissionSet>
3. 在你的machine-level的Web.config文件中, 建立一个新的自定义策略级别. 策略文件的名称是你在步骤1建立的那个策略文件名.
<securityPolicy> <trustLevel name="CustomMedium" policyFile="customWeb_mediumtrust.config" /> ... </securityPolicy>
4. 配置应用程序, 对运行在新的自定义策略级别的设置信任级别为CustomMedium. 你的安全策略类似如下例子.
<system.web> <securityPolicy> <trustLevel name="CustomMedium" policyFile="customWeb_mediumtrust.config" /> <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="CustomMedium" originUrl="" /> </system.web>
OleDbPermission, EventLogPermission and FileIOPermission
如果需要共同的权限许可, 你也许需要添加包括:
· OleDbPermission
· EventLogPermision
· FileIOPermission
OleDbPermission
如果你的服务器是支持多数据库类型, 在哪个已经准予medium trust的策略上, 除SqlClientPermission之外, 你需要向Web应用程序准予OleDbPermission
向准予OleDbPermission扩展medium trust策略
- 建立一个自定义策略文件和配置你的应用程序, 以使用自定义信任级别, 正如"Modifying Medium Trust Policy"所描述.
2. 向<SecurityClasses>部分添加以下权限许可类型.
<SecurityClass Name="OleDbPermission" Description="System.Data.OleDb.OleDbPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
3. 向名为”ASP.NET” 的PermissionSet节点, 添加非限制性的OleDbPermission, 展示如下
<PermissionSet class="NamedPermissionSet" version="1" Name="ASP.Net"> ... <IPermission class="OleDbPermission" version="1" Unrestricted="true"/> ... </PermissionSet>
锁定链接字符串
添加非限制性OleDbPermission, 意味着你的应用程序可以在服务器使用一些 OLE DB的provider. 在一个主机环境, 管理员可能需要使用更多高级表单, 更多来自OleDbPermission的语法, 锁定链接字符串, 它是允许访问指定的数据库的高级表单. 以下的例子将显示怎么限制访问一个指定的OLE DB数据资源.
<IPermission class="OleDbPermission" version="1"> <add ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/data/w4w.mdb" KeyRestrictions="" KeyRestrictionBehavior="AllowOnly"/> </IPermission>
<add>元素指出以下的属性:
· ConnectionString. 这个元素指定一个许可链接字符串.
· KeyRestrictions. 这个元素指定附加链接字符串参数, 这或许被添加一个依靠值为KeyRestrictionBehavior的链接字符串. 指定链接字符串的参数使用parameterName=的语法. 你可以通过限定每个之间用分号区分地指定多个参数.
· KeyRestrictionBehavior. 你可以设置这为 AllowOnly或PreventUsage.
· 如果你使用AllowOnly,附加链接字符串参数就指定在 KeyRestrictions属性中可能会被添加指定的链接字符串ConnectionString.
· 如果你使用PreventUsage, 链接字符串的参数指定在KeyRestrictions的属性可能不会被添加到指定的链接字符串ConnectionString, 尽管其他的链接字符串会被添加.
如果没有被指定的限制性的key, 而KeyRestrictionBehavior属性也设置为AllowOnly, 那就没有附加的链接字符串参数被允许.
如果没有被指定的限制性的key, 而KeyRestrictionBehavior属性也设置为PreventUsage, 哪附加字符串参数将会被允许.
EventLogPermission
Medium trust 策略是不允许访问Windows事件日志.
授予访问事件日志的权力
1. 建立自定义策略文件和配置你的应用程序, 去使用custom trust level, 正如” Modifying Medium Trust Policy"所述.
2. 添加以下的权限许可类到<SecurityClasses>部分于自定义策略文件中.
<SecurityClasses> ... <SecurityClass Name="EventLogPermission" Description="System.Diagnostics.EventLogPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> ... </SecurityClasses>
3. 添加EventLogPermission到名为” ASP.Net” 的permissionSet节点中, 如下.
<PermissionSet class="NamedPermissionSet" version="1" Name="ASP.Net"> ... <IPermission class="EventLogPermission" version="1"> <Machine name="." access="Write"/> </IPermission> ... </PermissionSet>
注意在写入的时候, 你必须设置access="administer" 才能在局部信任应用程序中写入事件日志.
建立事件源
如果你的应用程序需要使用应用指定的事件源, 在管理员允许访问是, 你应该在安装时就建立事件源. 一个好的近似的方法就是使用.NET安装类, 就像Windows Installer(如果你是使用.msi部署)或是通过InstallUtil.exe系统应用.
If you are unable to create event sources at installation time, and you are in deployment, the administrator should manually create new event source entry beneath the following registry key
如果你在安装时, 不允许建立事件源, 并且你是在部署, 那么管理员应该手动建立新的事件源入口到注册表, 如下
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/<LogName>
注意
在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/注册表中, 你不应该准予可写的权限到ASP.NET进程帐户(或者类似的帐户如果你的应用程序使用了类似的帐户). 如果你允许注册表和帐号具有可写访问, 攻击者可以编辑一些对系统的日志相关的设置, 包括访问控制日志.
FileIOPermission
如果你需要你的应用程序能访问非应用程序虚拟目录层级的文件, 你可以基于medium trust文件建立自定义策略,然后编辑FileIOPermission. 例如, 如下定义是可以让应用程序可以读”C:/SomeDir”的目录.
<IPermission class="FileIOPermission" version="1" Read="C:/SomeDir;$AppDir$" Write="$AppDir$" Append="$AppDir$" PathDiscovery="$AppDir$" />
通过让应用程序访问越过应用程序虚拟目录层级的文件, 你减少了编写代码访问安全隔离的份量. 如果你在一个服务器中, 有多个应用程序, 你需要保护资源, 例如ACLs的文件, 和对每个应用程序使用分开的标识符.
为Medium Trust部署
帮助设计和开发你的应用程序为medium trust, 考虑以下的:
· 鉴别资源类型, 你的应用程序需要访问和需要执行的特性操作.
·
知道在medium trust里面什么是接受访问的许可.
学习接受访问许可的最好方法是开放的, 可以检查 web_MediumTrust.config文件位于%windir%/Microsoft.NET/Framework/{Version}/CONFIG 目录中
· Configure your development environment and your application's Web.config file for medium trust.
配置你的开发环境和为medium trust配置, 你的应用程序中的Web.config文件
因为在开发之前做好这个配置, 所以你可以立刻看到权限许可请求失败和什么问题需要处理的.
·
对于现存的应用程序, 考虑使用Permcalc工具.
如果你有现有程序, 并想运行medium trust中, 考虑使用Permcalc工具去为你的应用程序所需决定适合的许可.你需要确保广泛的测试通过, 代码路径通过你的应用程序是已经执行的.
最好是为你的信任级别定一个目标, 在你开始设计、开发和设计、开发指定的信任级别之. 当
你转换现有应用程序到medium trust时, 普遍因为安全异常的缘故包括有:
· 召集非托管代码.
· 访问注册表.
· 写事件日志.
· 除了SQL Server, 链接其他的数据库.
· 在远程服务器上访问Web资源.
· 访问非应用程序虚拟目录层级的文件系统.
附加资源参考:
如果有所帮助, 请给原作者反馈, 地址如下
使用wiki或E-mail都可以:
他们专注和兴趣于:
· 制定建议的技术问题;
· 有效的和可能性问题;
- ASP.NET Web安装程序
键发布ASP.NET Web安装程序,搞WebForm的童鞋看过来... 前言:最近公司有个Web要发布,但是以前都是由实施到甲方去发布,配置,这几天有点闲,同事让我搞一个一键发布,就和安装软件那样的 ...
- VS“新建网站”与“新建Asp.Net Web 应用程序”的区别
WebApplication(新建Asp.Net Web 应用程序)编程模型的优点:针对大型网站 1.编译速度网站编译速度快,使用了增量编译模式,仅仅只有文件被修改后,这部分才会被增量编译进去. 2. ...
- 新建网站与新建Asp.Net Web 应用程序的区别
.net网站和应用程序区别,网站是动态执行的不用编译,他只依赖于自己的文档本身,甚至你用aspx里直接写jsp代码都可以,其实网站可以说只是在.net平台中打开的文档,相当于最初的记事本编码,他并不需 ...
- ASP.NET WEB应用程序(.network4.5)MVC 程序的结构解读1
https://www.cnblogs.com/-beauTiFul/p/8036509.html 简介 开发环境:VS2015 ASP.NET:可以开发出几乎所有运行在Windows上的应用程序:. ...
- Asp.NetCore Web应用程序中的请求管道和中间件
你是否会迷惑当我们请求一个ASP.NetWeb应用程序以后,它是怎么处理这些请求的,后台是怎么工作的,今天就讲一下Asp.NetCore Web应用程序中的请求处理过程. 上一节,我们讲到,Start ...
- ASP.NET Web 应用程序及页面生命周期
以客户端浏览器向 ASP.NET Web 应用程序页面发送请求(Request)为起点,以浏览器收到 Web 服务器的响应(Response)为终点,这一完整的过程被称为"应用程序及页面的生 ...
- asp.net 网站和asp.net Web 应用程序的一处不同
环境为:VS2008Team+.net3.5 asp.net 网站前台页面<%= %>这样绑定可以,asp.net Web 应用程序就不可以 示例代码如下: 1.asp.net网站 < ...
- vs2005新建项目中没有ASP.NET WEB应用程序
今天正准备使用vs 2005,发现根本打不开老师发过来的源代码Portal_Article.csproj文件,上网查了一下,好多人都说是是因为没有给vs 2005打补丁.我的新建项目里根本没有ASP. ...
- vs2005新建项目中没有ASP.NET WEB应用程序的解决方法
在vs2003的年代,我们可以在项目模板中选择创建"asp.net web应用程序",可是到vs2005中,就变成了创建网站,原有的创建"asp.net web应用程序& ...
随机推荐
- 【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷 ...
- EmitMapper的使用
1.普通的映射. public class UserInfo { public int id { get; set; } public string name { get; set; } public ...
- [CF #236 (Div. 2) E] Strictly Positive Matrix(强联通分量)
题目:http://codeforces.com/contest/402/problem/E 题意:给你一个矩阵a,判断是否存在k,使得a^k这个矩阵全部元素都大于0 分析:把矩阵当作01矩阵,超过1 ...
- 关于Hellas和Greece
一直以来我就好奇,为什么希腊的中文名字“希腊”和英文名字”Greece”听起来都不像(就像“德国”不像“Germany”一样),而且,为什么在很多体育比赛中看到希腊运动员的衣服上都是“Hellas”, ...
- Recommending branded products from social media -RecSys 2013-20160422
1.Information publication:RecSys 2013 author:zhengyong zhang 2.What 是对上一篇论文的拓展:利用社交媒体中用户信息 对用户购买的类别排 ...
- 2015年辽宁省赛Interesting Tree
题目描述 Recently, Miss Huang want to receive a Tree as her birthday gift! (What a interesting person!) ...
- 【python】 [基础] 数据类型,字符串和编码
python笔记,写在前面:python区分大小写1.科学计数法,把10用e代替,1.23x10·9就是 1.23e9 或者 0.00012就是1 ...
- .net MVC全球化资源使用心得
网上有的我就不说了,我只记录下我碰壁的事情. local资源就不说,这里只说global全局资源文件. 假设新建一个资源文件名称叫做resourceA, 下面几点记录备忘: resouceA就是Get ...
- cxf和spring结合,发布restFull风格的服务
rest(Representational State Transfer):表现层状态转化,它是一种风格,用于资源定位,例如:http://ip:port/user/student/001 和资源操作 ...
- 网站移植到linux上后常犯的错误
常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里 ...