Silverlight WCF + SSL安全错误 - 从未请求crossdomain.xml

7
我看到几个与我的问题相关的问题,但没有一个解决方案适用于我,因为我在生产环境中遇到了这个问题,而不是在本地开发期间,并且我已经尝试了所有建议的修复方法。
我有一个Silverlight 4应用程序,使用IIS托管的WCF服务。在生产环境中,这些服务通过HTTPS访问。尽管有有效的crossdomain.xml文件,但在访问服务时仍会出现著名的“安全错误”。
发生错误时尝试请求URI 'https://MYDOMAIN/MYSERVICE.svc'。这可能是由于企图在没有适当的跨域策略的情况下以跨域方式访问服务,或者策略不适用于SOAP服务所致。您可能需要联系服务所有者发布一个跨域策略文件,并确保它允许发送与SOAP相关的HTTP标头。此错误也可能是由于在Web服务代理中使用内部类型而未使用InternalsVisibleToAttribute属性引起的。请参阅内部异常以获取更多详细信息。--->System.Security.SecurityException--->System.Security.SecurityException:安全错误...
使用Fiddler,我可以看到没有请求crossdomain.xml或clientaccesspolicy.xml。只有对服务器的CONNECT请求。
我已经阅读了这个错误,虽然它指示crossdomain.xml/clientaccesspolicy.xml存在问题,但也可能在服务器发出无效证书时引发。在我的场景中似乎不是这种情况。
我确定以下设置是正确的:
1. crossdomain.xml 是有效的,并且托管在站点的根目录中
2. 服务正常工作(我们有其他使用各种技术的客户端,包括依赖于 crossdomain.xml 的 Adobe Flex。)
3. Silverlight 应用程序可以正常工作(它与本地服务和共享开发服务器上的服务一起完美运行***)
4. Silverlight 应用程序甚至不尝试请求 crossdomain.xml 或 clientaccesspolicy.xml(由 Fiddler 确认)
5. Silverlight 应用程序使用适当的配置来访问通过 https 的 WCF。以下是配置:
<configuration>  
    <system.serviceModel>  
        <bindings>  
            <basicHttpBinding>  
                <binding name="BasicHttpBinding_IMyServices" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">  
                    <security mode="Transport" />  
                </binding>  
                </basicHttpBinding>  
        </bindings>  
        <client>  
            <endpoint address="https://MYDOMAIN/MYSERVICE.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyServices" contract="Services.IMyServices" name="BasicHttpBinding_IMyServices" />  
        </client>  
    </system.serviceModel>  
</configuration>

什么还会导致这种问题?可能是因为Web服务器负载均衡吗?或者是证书出了问题,我没有注意到?如果你能至少指出正确的方向,将不胜感激。
(***有一件值得指出的事情:在我们的开发环境中遇到过类似的问题。尽管拥有适当的crossdomain.xml文件且未使用HTTPS,Silverlight应用程序无法访问共享开发服务器上的WCF服务。我通过将开发服务器添加为IE中的受信任站点来解决了这个问题。然而这个同样的解决方法对于生产环境不起作用,即使起作用也不是一个可接受的解决方法。但是,我在开发环境中必须这样做使我担心我在路上错过了什么……)

连接您的服务器的连接请求的响应代码是什么?当我在浏览器中访问您提供的链接时,我收到了“403-禁止访问:拒绝访问”的响应。 - wickedtreemonkey
我得到了一个200的响应代码。那个链接返回403,因为我链接到了被限制的域的根目录。服务端点是公开可访问的,因此我不想链接到它们,它们会返回200的响应。 - Keith
访问https://dev59.com/hlzUa4cB1Zd3GeqP3XI1。这可能会有所帮助。 - Saturn Sun
2个回答

11

问题在于我缺少clientaccesspolicy.xml。仅有crossdomain.xml是不够的。我认为这是因为WCF调用不仅跨浏览器,还跨协议(Silverlight应用程序通过http提供服务,但服务通过https提供)。

此外,我的clientaccesspolicy.xml必须显式允许http访问,如下所示:

<?xml version="1.0" encoding="utf-8"?>  
<access-policy>  
    <cross-domain-access>  
        <policy>  
            <allow-from http-request-headers="SOAPAction">  
                <!-- IMPORTANT! Include these lines -->
                <domain uri="http://*"/>  
                <domain uri="https://*"/>  
            </allow-from>  
            <grant-to>  
                <resource path="/" include-subpaths="true"/>  
            </grant-to>  
        </policy>  
    </cross-domain-access>  
</access-policy>

现在它运行得非常好。

在过程中我遇到了一些问题:

  • 我的浏览器缓存了clientaccesspolicy.xml和crossdomain.xml。每次更改这些文件后,我都必须清除缓存,否则它不会识别新版本,尽管IIS已经配置为防止客户端缓存此文件。
  • 对于clientaccesspolicy.xml和crossdomain.xml的请求有时没有显示在Fiddler中,我经常会看到CONNECT请求。我不明白原因,但我已经学会不依赖Fiddler来确认这些请求是否被执行了。也许我有一些流氓设置(不是“解密HTTPS流量”设置,因为我已经禁用它)。

3

当我尝试通过http访问我的网站,但我的服务是通过https提供时,我遇到了相同的错误。这个错误是由于我的ISS没有证书引起的,因此当应用程序尝试下载clientaccesspolicy时,它失败了。

在浏览器的任何调试工具中查看clientacccesspolicy文件,并检查是否正在下载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接