好几次了,执行的好好的Silverlight项目调用Web Service时报"System.Security.SecurityException: 安全性错误",如下图所示:
因为这几天只是学习、测试Silverlight的功能,并没有作什么正式的项目,所以每次看到这个就直接重新建一个工程,今天真的不耐烦了,上网找了下原因,大概是Silverlight跨域访问的权限问题,需要在Silverlight的宿主项目(ASP.NET的启动项目)下建立一个"clientaccesspolicy.xml"文件,然后将下面的代码贴到该文件中:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*" >
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
重新启动应用程序,OK!
再看看微软:
使服务跨域边界可用
使用 Silverlight 版本 4 进行跨域通信需要预防几种类型的安全漏洞,它们可被用于违法利用 Web 应用程序。“跨站点伪造”(Cross-site forgery) 作为一种利用手段,在允许跨域调用时会成为威胁。此利用手段包括在用户不知情的情况下向第三方服务传输未授权命令的恶意 Silverlight 控件。为了避免跨站点请求伪造,对于除图像和媒体之外的其他所有请求,Silverlight 在默认情况下只允许源站点通信。例如,在 http://contoso.com/mycontrol.aspx 上承载的 Silverlight 控件默认只能访问同一域中的服务(例如 http://contoso.com/service.svc),而不能访问位于 http://fabrikam.com/service.svc 的服务。这可以避免在 http://contoso.com 域上承载的恶意 Silverlight 控件对 http://fabrikam.com 域上承载的服务调用未授权操作。
若要允许 Silverlight 控件访问其他域上的服务,该服务必须明确选择允许跨域访问。通过选择,服务声明它公开的操作可以由 Silverlight 控件安全地调用,而不会对该服务存储的数据造成具有潜在危害的结果。
Silverlight 4 支持两种不同的机制供服务选择跨域访问:
- 在承载服务的域的根目录中放置一个 clientaccesspolicy.xml 文件,以配置服务允许跨域访问。
- 在承载服务的域的根目录中放置一个有效的 crossdomain.xml 文件。该文件必须将整个域标记为 public。Silverlight 支持 crossdomain.xml 架构的一个子集。
有关跨域访问的更多信息,请参见 Silverlight 2 中的网络安全访问限制。
使用 clientaccesspolicy.xml 文件来允许跨域访问
构建允许 Silverlight 客户端访问的服务。有关如何执行此操作的更多信息,请参见如何:为 Silverlight 客户端生成服务。
创建允许访问该服务的 clientaccesspolicy.xml 文件。以下配置允许从任何其他域访问当前域上的所有资源。
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>或者,如果只允许从其他域中的一个进行访问(例如 http://contoso.com),则将上面 clientaccesspolicy.xml 文件的
<allow-from>
元素内的<domain uri="*"/>
行替换为<domain uri="http://contoso.com"/>
行。若允许从任何通过 HTTP 应用程序承载的 Silverlight 控件访问 HTTPS 服务,则需要将
<domain uri=”http://*” />
元素放入<allow-from>
元素。标头特性的有效值包括:
- 通配符 (“*”) - 允许所有未列入黑名单的标头
- 允许标头的逗号分隔列表。这些允许的标头可以使用通配符后缀,例如,“X-CUSTOM-*”。
若允许通过 TCP 套接字访问服务,则将
<socket-resource port="4502" protocol="tcp" />
添加到<grant-to>
元素,其中 4502 是承载服务的端口值。- 通配符 (“*”) - 允许所有未列入黑名单的标头
将 clientaccesspolicy.xml 文件保存到承载该服务的域的根目录中。例如,如果该服务在 http://fabrikam.com 上承载,则文件必须位于 http://fabrikam.com/clientaccesspolicy.xml。
通过从其他域调用服务来测试是否已启用访问。
使用 crossdomain.xml 文件来允许跨域访问
构建允许 Silverlight 客户端访问的服务。有关如何进行此操作的更多信息,请参见如何:为 Silverlight 客户端生成服务。
创建包含以下配置的 crossdomain.xml 文件。必须将该文件配置为允许从任何其他域访问服务,否则 Silverlight 4 将无法识别它。
将 crossdomain.xml 文件保存在承载服务的域的根目录中。例如,如果该服务在 http://fabrikam.com 上承载,则该文件必须位于 http://fabrikam.com/crossdomain.xml。
通过从其他域调用服务来测试是否已允许访问该服务。
版权所有 (C) 2010 Microsoft Corporation。保留所有权利。