默认情况下,Silverlight 支持在同域或源站点上调用 Web 服务。同域意味着调用必须使用同一子域、协议和端口。这是出于安全原因以及防止跨域伪造。
使用 Silverlight 版本 4 进行跨域通信需要预防几种类型的安全漏洞,它们可被用于违法利用 Web 应用程序。"跨站点伪造"(Cross-site forgery) 作为一种利用手段,在允许跨域调用时会成为威胁。此利用手段包括在用户不知情的情况下向第三方服务传输未授权命令的恶意 Silverlight 控件。为了避免跨站点请求伪造,对于除图像和媒体之外的其他所有请求,Silverlight 在默认情况下只允许源站点通信。例如,在 上承载的 Silverlight 控件默认只能访问同一域中的服务(例如 ),而不能访问位于 的服务。这可以避免在 域上承载的恶意 Silverlight 控件对 域上承载的服务调用未授权操作。
若要允许 Silverlight 控件访问其他域上的服务,该服务必须明确选择允许跨域访问。通过选择,服务声明它公开的操作可以由 Silverlight 控件安全地调用,而不会对该服务存储的数据造成具有潜在危害的结果。
Silverlight 4 支持两种不同的机制供服务选择跨域访问:
- 在承载服务的域的根目录中放置一个 clientaccesspolicy.xml 文件,以配置服务允许跨域访问。
- 在承载服务的域的根目录中放置一个有效的 crossdomain.xml 文件。该文件必须将整个域标记为 public。Silverlight 支持 的一个子集。
下图演示了在使用默认设置的 Silverlight 应用程序中所允许和不允许的调用示例。默认设置允许的 HTTP 通信
使用跨域策略文件启用跨域通信
通过在域的根部署使用正确跨域策略文件的 Web 服务,可以在其他域中启用 Silverlight 应用程序要调用的 Web 服务。Silverlight 支持两种类型的跨域策略文件。
-
Silverlight 客户端访问策略文件 (clientaccesspolicy.xml)
-
Adobe Flash 跨域策略文件 (crossdomain.xml) 的子集
下图演示一个使用客户端访问策略文件的跨域通信示例。
通常,如果 Silverlight 应用程序检测到其请求是一个跨域请求,它将首先在 Web 服务的应用程序根处查找 Silverlight 客户端访问策略文件 (clientaccesspolicy.xml)。如果这个请求导致"404 未找到"或其他错误,应用程序将在应用程序根处查找 Adobe Flash 跨域策略文件 (crossdomain.xml)。不允许重定向跨域策略文件。此外,对每个应用程序会话只请求一次跨域策略文件。
向 Silverlight 跨域调用方公开 Web 服务的安全注意事项
允许 Silverlight 客户端在跨域情况下访问 Web 服务之前,有一些重要的安全注意事项。只要放置好客户端访问策略文件,就应将承载 Web 服务的 Web 服务器配置为禁用浏览器缓存。这使您能够轻松更新文件或在必要时限制对 Web 服务的访问。一旦选中了客户端访问策略文件,它就保持对浏览器会话有效,这样可使非缓存对最终用户的影响降至最小。
此外,所有 Silverlight 请求发送时都带有 cookie 和身份验证。这意味着如果您有允许用户访问私有信息的 Web 服务,则应在另一个域上承载这些 Web 服务,而不是将这些服务向第三方调用方公开。例如,试想您有一个承载于 http://www.tailspintoys.com 的 Web 存储区。该站点允许客户存储包括信用卡号在内的帐单信息。您不应将返回产品清单的 Web 服务向同一域中的第三方 Silverlight 客户端公开。由于 cookie 和身份验证随每个消息发送,如果将这些 Web 服务承载于同一域上,则实际上给予了第三方调用方访问客户私有帐单信息的权限。在此示例中,公开的 Web 服务能够安全地承载于 http://services.tailspintoys.com,因为这是一个不同的域。您必须认真考虑向谁公开了 Web 服务,以及还有哪些其他 Web 服务位于此域。此外,应始终使客户端访问策略文件尽可能严格一些。
SilverLight与Wcf通信时,跨域文件很关键。而且在创建wcf服务的时候也很有技巧,
1、如果我们直接创建【wcf服务库】项目的话,需要发布成为web站点,在来访问之。而且还会出现在WCF测试客户端测试没有问题的东西在访问时会出现问题的情况。还有关键点“App.config配置文件中的endpoint配置节的binding="wsHttpBinding"属性需要更改设置为:BasicHttpBinding”.
2、跨域文件很关键
3、SilverLight3.0 或 4.0 在通信时测试未发现异常。
clientaccesspolicy.xml文件内容
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*"><!--最关键的节点 http-request-headers 最关键的属性
跨域请求的标头支持
如果使用浏览器 HTTP 处理,则仅当在客户端访问策略文件中显式允许时,才对跨域 POST 请求允许请求标头。客户端 HTTP 处理则在客户端访问策略文件中允许时,对所有 HTTP 方法启用请求标头。此规则的一个例外是 Content-Type 标头。跨域 POST 请求始终允许有 Content-Type 标头,不需要在客户端访问策略文件中显式调用这类标头。您还可以启用其他标头,方法是将 http-request-headers 设置为以下值之一:
-
单个标题类型 (SOAPAction)
-
逗号分隔的标头列表 (SOAPAction, x-custom-header)
-
启用所有标头的通配符 (*)
-->
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
Adobe Flash 跨域策略文件
Silverlight 支持 Adobe Flash 跨域策略文件(名为 crossdomain.xml)的子集。Silverlight 支持 <allow-access-from> 标记具有以下特性。
-
domain 特性。此特性允许的唯一值为 "*",这意味着向所有调用方公开整个域。
-
secure 特性。此特性仅在目标域为 HTTPS 时才有意义。此特性接受 true 或 false 值,它指示是否允许 HTTP 调用方访问此域中的资源。
-
headers 特性。此特性列出接受的标头。
下面是 Silverlight 支持的 Adobe Flash 跨域策略文件 (crossdomain.xml) 的一个示例。
crossdomain.xml文件内容
<?xml version="1.0" encoding="utf-8" ?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>