WCF 跨域策略安全错误

Posted

技术标签:

【中文标题】WCF 跨域策略安全错误【英文标题】:WCF cross-domain policy security error 【发布时间】:2010-11-23 15:30:23 【问题描述】:

我正在使用 VSTS 2008 + C# + WCF + .Net 3.5 + Silverlight 3.0。我在 html 页面中托管 Silverlight 控件并从 VSTS 2008 调试它(按 F5,然后在 VSTS 2008 内置 ASP.Net 开发 Web 服务器中运行),然后调用另一个 WCF 服务(托管在另一台运行 IIS 7.0 + Vista 的机器上) . WCF服务很简单,就是返回一个常量字符串给客户端。

从 Silverlight 调用 WCF 服务时,我收到以下错误消息,

尝试向 URI“https://LabTest/Test.svc”发出请求时出错。这可能是由于在没有适当的跨域策略或不适合 SOAP 服务的策略的情况下尝试以跨域方式访问服务。您可能需要联系服务的所有者以发布跨域策略文件并确保它允许发送与 SOAP 相关的 HTTP 标头。此错误也可能是由于在 Web 服务代理中使用内部类型而不使用 InternalsVisibleToAttribute 属性造成的。有关详细信息,请参阅内部异常。

这里是clientaccesspolicy.xml文件,有什么问题吗?

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from  http-request-headers="*">
        <domain uri="*">
        </domain>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"></resource>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

【问题讨论】:

所以 wcf 服务被构建为一个网站并托管在 IIS 中,并且 clientaccesspolicy 位于共享站点的根目录中? 是的。我发布的是clientaccesspolicy.xml 的内容。我在服务器端使用自签名证书,可以吗? 听说跨域WCF https调用的自签名证书有一些限制,不知道是不是限制? 【参考方案1】:

这可能是在黑暗中拍摄。但我记得遇到过类似的场景,在 vista 和 IIS7 上本地设置 WCF 服务。事实证明,我必须在我的 web.config 文件中更具体地使用 baseAddressPrefixFilters 添加一些行,阅读这篇其他帖子:Here。我遇到了问题,因为我的默认网站有多个主机绑定。它需要 *:80 和 www.mydomain.com:80 而 WCF 不喜欢这样。

【讨论】:

【参考方案2】:

我遇到了类似的问题,但我的解决方案要简单得多。 在我的 clientConfig 文件中,我的不同服务的端点地址具有不同的 URL。 有些有本地主机,有些在 URL 中有我的机器名称。 一旦我让他们都使用本地主机,它就解决了我的问题。

【讨论】:

【参考方案3】:

一个想法可能是使用 fiddler 并找到请求跨域策略 xml 的请求。这是失败了吗?检查它指向的地址。我使用它调试了我的问题。它指向服务器的根目录,而我的跨域策略 xml 位于 WCF 项目文件夹中。

【讨论】:

以上是关于WCF 跨域策略安全错误的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 jquery ajax 中使用 wcf 服务的跨域策略?

WCF REST 服务模板 40(CS) 跨域错误

如何在 C# 中解决跨域策略安全异常

JS同源策略和跨域访问

第二百七十四节,同源策略和跨域访问

同源策略与跨域访问