Silverlight跨域策略文件
2011-11-02 15:07 elivsit 阅读(981) 评论(0) 编辑 收藏 举报Flash跨域访问策略文件格式可以很好地通过域来限制对服务器的访问,但是它不允许对服务器的特定资源实施访问控制。在目前"安全第一"的情况下,更好地控制哪种资源可以访问将是众所期待的功能。不管怎么样,如果调用者不能访问服务器上的所有文件夹,那么为什么首先为调用者赋予这么高的访问权限呢?
为了减少跨域调用者所遇到的问题,微软公司发布Silverlight特有的跨域策略文件,名为clientaccesspolicy.xml。该文件为哪些域可以使用跨域调用来调用服务器、该域中的哪些资源允许访问以及允许使用哪些HTTP请求头,提供了额外的控制。下面是一个clientaccesspolicy.xml文件的例子:
- <?xml version="1.0" encoding="utf-8"?>
- <access-policy>
- <cross-domain-access>
- <policy>
- <allow-from http-request-header="*">
- <domain uri="*"/>
- </allow-from>
- <grant-to>
- <resource path="/Services" include-subpaths="true"/>
- </grant-to>
- </policy>
- </cross-domain-access>
- </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元素:
- <?xml version="1.0" encoding="utf-8"?>
- <access-policy>
- <cross-domain-access>
- <policy>
- <allow-from http-request-headers="*">
- <domain uri="*"/>
- </allow-from>
- <grant-to>
- <resource path="/Services" include-subpaths="false"/>
- </grant-to>
- </policy>
- <policy>
- <allow-from http-request-headers="*">
- <domain uri="*.domainName.com"/>
- </allow-from>
- <grant-to>
- <resource path="/SpecialServices" include-subpaths="true"/>
- </grant-to>
- </policy>
- </cross-domain-access>
- </access-policy>
该跨域策略文件允许domainName.com域访问SpecialServices目录以及该目录下的子路径。当Silverlight客户端可以访问服务器根目录下的所有内容时,resource元素的path属性可以赋予/值,并且为include-subpaths属性赋予值true。
当某个服务器的Flash程序或者Silverlight客户端可以访问所有资源时,将一个简单的Flash crosspolicy.xml文件放置在服务器上就可以完成该任务。当需要为Silverlight客户端锁定特定的资源时,需要将一个clientaccesspolicy.xml文件放置该根目录下。如果Flash客户端不会调用服务器,那么推荐使用clientaccesspolicy.xml文件,因为该类文件可以限制资源和HTTP请求头,所以该类文件可以提供最好的安全性。