应用程序的组合是从网站上下载到客户端的。· 组合是从哪个URL获得的?安全策略需要明确的地址,而组合是从这个地址下载的。· 组合是从哪个区获得的?区是基于代码的位置,对安全标准,如 Internet, intranet和本机等等,的描述。· 组合的强名(strong name)是什么?强名是由组合的创建者提供了密码强化后的标识符。尽管它没有提供对创建者的任何证明,但它唯一标识了组合,确保了组合没有被破坏过。根据对这些问题的回答,及其它证据,安全策略可以对赋予组合垢合适许可进行计算。从多种来源可以得到证据,包括CLR,浏览器,微软,及外壳--这依赖于代码的来源。策略驱动的信任模型使用代码证据当组合被调入内存时,CLR策略系统通过收集组合的证据并在策略环境中对证据进行计算,从而决定赋予组合什么样的许可权。CLR策略系统然后根据评估过的证据和组合作出的许可请求给予组合一组许可。只有在组合被给予了一组最少的许可后,或组合根本不需要许可权,组合的创建者才能知道组合正确运行。通过一个或多个对特定许可的请求,这样的附加需求可以被传送至策略系统。根据许可请求的类型,策略系统可以进一步限制给予组合的许可(删除不必要的许可)或甚至拒绝将组合装入内存(如果运行组合所需的最小许可没有被策略给予)。在不存在任何许可请求的情况下,组合永远不会被给予多于策略系统将会给予的许可权限,请求只是进一步限制得到的许可。安全策略包含了许多代码组,这些组包含了根据证据应给予的许可权。代码组描述的许可可提供给从特定的安全区域获得的组合,或提供给由特定发行商签名过的组合,等等。尽管随CLR发行了一组默认的代码组(及相关许可),但管理员可以对这些CLR安全的进行定置,以适合他们的特殊需求。记住,通过定义与证据相关的代码组,任何东西都可以作为证据提交,只要安全策略可以使用它。创建许可的的过程涉及到对证据的评估,以确定代码组适用于哪个等级:企业,机器,和用户。策略按上面顺序对这三个等级进行评估,然后创建交插了三个等级的许可设置。管理员可以将任何一个策略等级标记为终结(final),这样做应付阻止在其它等级上对策略做进一步评估。例如,管理员可以在机器级别上对组合终止策略,这样就会阻止用户级策略对该组合的应用。一旦策略完成,许可的最初设置也就创建了。组合通过从三个方面做出特定的请求可以优化这些许可:· 第一方面是指定为了使组合运行它必须拥有的最小许可设置。如果这些许可没有给予,那么组合将不同调入到内存,并抛出例外。· 第二,可以指定一组可选的许可。尽管组合希望存在这些许可,但如果无法获得这些许可,它仍可以调入到内存。· 最后,行为特别好的组合实际上会拒绝它们所不需的有风险的许可。这三个优化选项是调入时作为声明语句实现的。在运行时,许可是根据代码的执行计算的。右侧的图总结了这个过程的发生顺序。组合A3将它的证据和来自主机的证据提供给策略评估器。策略评估器在创建许可时也要考虑从组合得到的许可请求,"G3"。组合A3由组合A2调用,而A2又是由组合A1调用的。当组合A3执行一个引发安全检查的操作时,A2和A1获得的许可同样也要进行检查,以确保它们拥有A3所请求的许可权限。在这个过程中,此过程称为堆栈遍历(walking),堆栈中每个组合的许可权限都要进行检查以确定所给予的权限设置是否包含安全检查所需要的许可。如果堆栈中的每个组合被给予了安全检查所需要的许可,调用将成功。如何任何组合没有给予所需要的许可,堆栈遍历过程失败,安全例外将被抛出。图 1.主机和组合为策略评估器提供证据,评估器使用安全策略和许可请求确定组合的许可权限。应用程序中不同运行组件的许可权限然后用于作出授权决定。代码访问安全堆栈遍历可以保护代码不受攻击。在精通的攻击中,恶意代码欺骗受信任代码执行它独自不能运行的操作--有效地利用代码的许可权限实现恶意的目的。对这类攻击,开发人员很难进行防备--但堆栈遍历确保了如果涉及到了低级信任等级的代码,有效许可将被减少到信任等级最低的代码具有的许可。结果,代码将从源处获得不同的信任等级,并在适合于特定的代码执行环境的限制下运行。