Internet资源管理器定义了三种特别情形的URL类别。本地Intranet (Local Intranet)类别(由SecurityZone.Intranet表示)适用于通过使用UNC风格路径(例如,\\server\share\code.dll)的远程文件系统来加载的所有代码。这个区域还适用于使用WINS风格名字的基于HTTP的URL(例如.http//Server/vroot/code.dll),而不是DNS或者主机的IP地址。
Internet资源管理器允许你进一步细化在该区域的构成条件,这些只是默认测试的配置。
Internet资源管理器还定义了两种类别,用于识别可以信赖的和怀有恶意的站点。默认情形下,这些类别是空的:然而,用户或系统管理员可以给这些类别添加任何数量的基于模式的(pattern-based) URL。这些类别由SecurityZone.Trusted和SecurityZone.Untrusted表示。任何不属于刚才所描述的这三种情形分类的codcbase URL都归属于通用的SecurityZone.Internet区域。
最后一种基于位置的证据类型是
ApplicationDirectory。宿主应用程序必颁显式地提供该证据类型,它指定了正在运行程序的基本目录。该证据类型与Zone类型相似,它把codebase URL划分成不同类别。ApplicationDirectory证据类型通常与URL证据类型配合使用,为从应用程序的APPBASE目录加载的DLL授予特定的权限。
CLR为每种证据类型提供了可编程的类型。这些类型都位于System.Security.Policy命名空间下,并且都在mscorlib程序集中。例如,下面的代码为给定的codebase URL创建了Url、Site和Zone对象。
using System;
using System.Security;
using System.Security.Policy;
class App{
static void Main(string[] argv)
{
//从命令行输入codebase url
string codebase=argv[0];
//创建3个证据对象
Url url=new Url(codebase);
Zone zone=Zone.CreateFromUrl(codebase);
Site site=null;
try{site=Site.CreateFromUrl(codebase);}
Catch(ArgumentException){/*忽略*/}
//显示相应的位值
Console.WriteLine(“url:{0}”,url.Value);
Console.WriteLine(“zone:{0}”,zone.SecurityZone);
if(site!=null)
{
Console.WriteLine(“site:{0}”,site.Name);
}
}
}
注意,site类型比较特别。这是因为基于文件的URL没有与之关联的Site,并且,假如传入一个基于文件的Url,那么Site.CreateFromUrl将抛出一个System.ArgumentException异常。
到目前为止我们已经讨论了基于位置的证据。CLR还支持其他两种证据娄型,它们用于谁开发了这个代码,而与它是从哪里加载的无关。在这两种证据当中,StrongName类型是比较容易理解的。
拥有公钥(public key)并将其作为名字一部分的程序集,在加载时将被赋予StrongName证据类型。StrongName的三个属性对应于程序集名字的四个属性中的三个。加载器根据正被加载的程序集的元数据,初始化Name,Version和PublicKey属性。在Site、Url和Zone情况下.你可以通过编程的方式构造一个StrongName证据对象,如下所示:
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;
class App{
static StrongName CreateFromAssembly(Assembly assm){
//获得名字和公钥
AssemblyName name=assm.GetName();
byte[] pk=name.GetPublicKey();
//构建一个StorngName证据对象
StrongNamePublicKeyBlob blob=new StrongNamePublicKeyBlob(pk);
return new StrongName(blob,name.Name,name.Version);
}
static void Main(string[] argv){
//接收作为命令行自变量的程序集名字
string name=argv[0];
//加载这个程序集,并获取强名称证据
Assembly assm=Assembly.Load(name);
StrongName sn=CreateFromAssembly(assm);
//显示相应的位值
Console.WriteLine(sn.Name);
Console.WriteLine(sn.Version);
Console.WriteLine(sn.PublicKey);
}
}
你可以使用公钥创建只用于程序集的StrongName证据类型。还应该注意,在该例子中,你需要一个System.Security.Permissions.StrongNamePublicKeyBlob类型的包装器对象,用来包将包含公钥的字节数组。这个包装器对象既可以接收公钥,也可以接收公钥标记。
基于StrongName的证据假定所有组织承认将公钥作为特定开发组织的标识。不被承认的公钥是无用的,因为没有办法从算法上鉴别公钥所有者的身份,这种能力由X.509证书提供。它由第六种证据类型-Publisher所使用。
程序集加载器将签署了X.509证书的代码添加Publisher证据类型,不像公/私钥对,公/私钥对可以在开发人员的机器上可靠地自主生成,而证书将假定存在一个受信任的证书管理机构(certificate authorny.CA),例如VerSign、Entrust或Thawte。这些证书管理机构只对知名实体颁发证书,而所谓的知名实体就是可以通过外面的技术(out-of-band)来证实其身份的实体。为了让开发人员使用证书,微软发布了两个工具,可以发射不可靠的(untrustworthy)证书用于测试makecert.exe和cerc2spc.exe。这两个工具分别生成X.509证书和软件发行者证书(Software Publisher Certificate,SPC);然而,由它们产生的证书不具备有意义的CA,因此它们的用处仅仅限于测试,而不能用于交付代码。关于获取合法的证书的更多细节可以参见你喜欢的CA网站。R