代码改变世界

Silverlight跨域策略文件

2011-11-02 15:07  elivsit  阅读(981)  评论(0编辑  收藏  举报

Flash跨域访问策略文件格式可以很好地通过域来限制对服务器的访问,但是它不允许对服务器的特定资源实施访问控制。在目前"安全第一"的情况下,更好地控制哪种资源可以访问将是众所期待的功能。不管怎么样,如果调用者不能访问服务器上的所有文件夹,那么为什么首先为调用者赋予这么高的访问权限呢?

为了减少跨域调用者所遇到的问题,微软公司发布Silverlight特有的跨域策略文件,名为clientaccesspolicy.xml。该文件为哪些域可以使用跨域调用来调用服务器、该域中的哪些资源允许访问以及允许使用哪些HTTP请求头,提供了额外的控制。下面是一个clientaccesspolicy.xml文件的例子:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <access-policy> 
  3. <cross-domain-access> 
  4. <policy> 
  5. <allow-from http-request-header="*"> 
  6. <domain uri="*"/> 
  7. </allow-from> 
  8. <grant-to> 
  9. <resource path="/Services" include-subpaths="true"/> 
  10. </grant-to> 
  11. </policy> 
  12. </cross-domain-access> 
  13. </access-policy> 

该文件允许任意站点的跨域调用访问位于服务器根目录下Services文件夹中的资源。allow-from元素提供了定义哪些域可以访问服务的一种方式,这一点非常类似于Flash的crossdomain.xml文件。但是,Silverlight的策略文件更深入了一步,该文件使用grant-to元素来允许服务器控制哪些资源可以访问,以及通过使用http-request-header属性来控制哪种HTTP请求头可以传递。http-request-header属性接收通配符(*)字符以表示所有HTTP请求头均可以传递。关于当前不可用头的更多细节,可以在Silverlight SDK中找到,也可以在http://msdn.microsoft.com上找到。通过为http-request-header属性提供一个由逗号隔开的列表,可以在http-request-header中定义多个请求头。

当不同域可以访问不同资源时,可以添加多个policy元素:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <access-policy> 
  3. <cross-domain-access> 
  4. <policy> 
  5. <allow-from http-request-headers="*"> 
  6. <domain uri="*"/> 
  7. </allow-from> 
  8. <grant-to> 
  9. <resource path="/Services" include-subpaths="false"/> 
  10. </grant-to> 
  11. </policy> 
  12. <policy> 
  13. <allow-from http-request-headers="*"> 
  14. <domain uri="*.domainName.com"/> 
  15. </allow-from> 
  16. <grant-to> 
  17. <resource path="/SpecialServices" include-subpaths="true"/> 
  18. </grant-to> 
  19. </policy> 
  20. </cross-domain-access> 
  21. </access-policy> 

该跨域策略文件允许domainName.com域访问SpecialServices目录以及该目录下的子路径。当Silverlight客户端可以访问服务器根目录下的所有内容时,resource元素的path属性可以赋予/值,并且为include-subpaths属性赋予值true。

当某个服务器的Flash程序或者Silverlight客户端可以访问所有资源时,将一个简单的Flash crosspolicy.xml文件放置在服务器上就可以完成该任务。当需要为Silverlight客户端锁定特定的资源时,需要将一个clientaccesspolicy.xml文件放置该根目录下。如果Flash客户端不会调用服务器,那么推荐使用clientaccesspolicy.xml文件,因为该类文件可以限制资源和HTTP请求头,所以该类文件可以提供最好的安全性。