欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表

.net中安全策略的实施(三)

创建时间:2013年05月14日 21:48  阅读次数:(4331)
分享到:
还可以对整个程序集进行批注,以改变实际授予的权限。SecurityAction.RequestMinimum动作指明了必须授予程序集指定的权限,才能使得程序集被成功加载。假如指定的权限不能通过策略而授予的话,程序集加载器将不能成功地加载它。此外,即将授予程序集的方法的实际权限,是由策略所授予的权限的一个子集。特别地,方法的有效权限只是所有标记为SecurityAction.RequestMinmum特性的权限,联合(Union)任何标记为SecurityAction.RequestOptional特性(策略所允许的)的权限,再减去那些标以SecurityAction.RequestRefuse特性的权限。例如考虑下面的C#代码:
using System.Net;
using System.Security.Permissions;
[assembly:DnsPermission(SecurityAccess.RequestMinimum,Unrestricted=true),
EnvironmentPermission(SecurityAction.RequestMinimum,Unrestricted=true),
FileIOpermission(SecurityAccess.RequestOptional,Unrestricted=true),
FileIOPermission(SecurityAccess.RequestRefuse,Write=@”C:\abtoexec.bat”)]

public sealed class Utils{
public static IPAddress LookupHost(string name){
return Dns.GetHostByName(name).AddressList[0];
}
}

在这个示例中,程序集中的所有方法至少具有DnsPermission权限和EnvironmentPermission权限。假如策略疏忽授予任何一个权限的话,程序集的加载都将失败  另外,CLR将授予程序集任何策略允许的FileIOPermissmns权限,不过,写入文件C:\autoexec.bat的能力将被明确地拒绝。图9.9展示了一个给定堆栈框架的有效权限是如何计算的。
有效权限

此外,还有两个安全动作我没有讨论过,它们是SecurityAction.InheritanceDemand和SecurityAction. LinkDemand.SecurityAction.InheritanceDemand特性允允许一个基类型要求派生类型保证授予给定的权限。考虑下面的c#抽象基类:
using System.Security.Permissions;
[UIPermission(SecurityAction.InheritanceDemand,Unrestricted=true)]
public abstract class MyWindow(
public abstract void ShowMe();
)

所有派生于MyWindow的类型都必须具有UIPermission权限,这个安全要求将作为派生类型加载过程的一部分而被隐式执行。

SecurityAction.LinkDemand特性类似于SecurtyAction.Demand特性。不过,SecurityAction.Demand特性用于将权限要求施加于直接调用方面而不是整个堆栈。当JIT编译器试图编译一个特定的方法时,该方法中所有对标以LinkDemand特性的方法调用都会强制执行一个安全检查。不像常规的Demand调用,这个检查将只查看直接调用方(在这种情况下,方法被实时编译),而且,不像常规的SecurityAction.Demand特性,后者在方法每一次被调用时都被评估,SecurityAction.LinkDemand只在实时编详时评估一次,这使得它的执行代价要低得多。

LinkDemand和InheritanceDemand都为使用标识权限(identity permissions)提供了一个理想的地点,例如,考虑来自于同一个厂商的程序集集台需要紧密协作的情况。遗憾的是,常规的访问修饰符(例如,public或internal)极其粗糙,不允许你将访问权授予某个指定程序集的方法。然而,对于要求调用方具有特定标识权限(例如,StrongNameIdeintity Permission)的方法,通过应用一个LinkDemand特件,你就可以要求所有调用方的程序集名字中必须有一个特定公钥。考虑下面简单的C#示例:
有效权限

撇开DoIt方法被标识为public的事实不谈,它只能被带有LinkDemana特性中指定公钥的方法所调用。如果试图从未带有这个指定公钥的程序集中调用该方法,则在JIT编译时将会失败。同样,你还可以用InheritanceDemand特性标记一个抽象基类:
有效权限

给定了这个类型定义,任何从PermissionImpl派生下来的类型都必须属于带有这个指定公钥的程序集。所有试图从不带有这个公钥的程序集中加载和初始化一个派生于PermissionImpl的类型,都会在类型初始化时失败。

我们走到哪儿了
CLR提供了以组件为中心的安全模型,这种安全模型被称为代码访问安全。这种模型假定每一个程序集都可以提供其来源的证据,这些证据既包括谁编写这些代码,又包括它是从哪里下载的。代码访问安全使用一种可配置的安全策略,依据征据,将权限授予代码。尽管CLR隐式地实施某些方面的安全策略,但是,显式实施安全是受信任程序库的任务,这既可以使用强制式编程接口,也可以使用声明式特性来完成。/
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 4+13=? 的结果(结果是:17)
结  果: