【问题标题】:Silverlight 5 Opening Socket AccessDeniedSilverlight 5 打开套接字访问被拒绝
【发布时间】:2016-12-19 17:49:10
【问题描述】:

我有一个 Silverlight 5 应用程序尝试建立与服务器的套接字连接,如下所示:

var targetEndpoint = new DnsEndPoint("subdomain.maindomain.com", 443);
var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var socketAsyncEventArgs = new SocketAsyncEventArgs {RemoteEndPoint = targetEndpoint};
socketAsyncEventArgs.Completed += AsyncConnectCallback;
clientSocket.ConnectAsync(socketAsyncEventArgs);

我在 https://subdomain.maindomain.com/clientaccesspolicy.xml 有以下 clientaccesspolicy.xml 文件:

<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from http-request-headers="*" http-methods="*">
                <domain uri="https://subdomain.maindomain.com"/>
                <domain uri="*"/>
            </allow-from>
            <grant-to>
                <resource path="/" include-subpaths="true"/>
                <socket-resource port="4502" protocol="tcp"/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>

我能够从 Visual Studio 运行 Silverlight 应用程序的本地实例,并且可以建立套接字连接,既可以在浏览器内运行,也可以在浏览器外运行。当我部署应用程序时,我仍然可以使用浏览器外版本进行连接,但浏览器内版本会出错并显示以下消息:

AccessDenied: An attempt was made to access a socket in a way forbidden by its access permissions.

在我从 Visual Studio 运行的本地环境中,如果我创建主机文件条目:

127.0.0.1 myapp.local

并更新我的localhost浏览器内实例(从VS运行)以使用myapp.local,我可以重现相同的错误,这表明当根域不是localhost时发生错误,无论在哪里应用程序已托管。

我已检查我的防火墙和防病毒软件的事件日志,看是否有迹象表明它们可能会阻止连接请求,但没有看到任何证据。

有其他人遇到过这个问题并就我的问题提出建议吗?

【问题讨论】:

  • code和xml中的端口号有冲突。保留端口 443(请参阅en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers)。 1000 以下的端口号是保留的,并且经常被防火墙和/或病毒检查程序阻止。 127.0.0.1 的错误可能与端口号不同。 127.0.0.1 是环回 IP 地址,只能在 Net 库中用于监听(在服务器端)。如果在 Connect() 方法中使用 Net Library 会报错。
  • 端口号不同并不冲突——xml中的端口号用于其他目的。我知道 443 是为 TLS/SSL 保留的,但这正是建立套接字连接的原因,以便能够转发 TLS 请求。
  • 几年前我做了一些 SSL 集成,但不记得所有细节了。您可能需要参考 Wiki 文章:en.wikipedia.org/wiki/Transport_Layer_Security。我会使用像 Wirsshark 或 Fiddler 这样的嗅探器来准确找出您在协议中失败的位置。来自网络库的错误消息有时会产生误导。您还没有指定您使用的 TLS 版本。确保它是正确的版本。
  • 我正在使用第 3 方库(eldos 安全黑盒)来处理 TLS 详细信息。我确实使用 wireshark 来监控我的 TLS 流量,但在这种情况下,代码不足以开始发送 TLS 请求。我试图打开的套接字是用于发送 TLS 请求数据包的通道,但由于无法打开套接字,所以我没有足够远来发送数据包。在这种情况下,TLS 实现是无关紧要的,因为建立正常的套接字连接是失败的。
  • 如果没有发送消息,那么您可能正在使用 127.0.0.1 和 Connect() 方法。 Connect 方法必须使用服务器的 IP 地址(或名称)。 127.0.0.1 仅用于服务器监听。 Net 库不会从以 127.0.0.1 作为目标 IP 地址的客户端发送任何消息。

标签: c# sockets silverlight-5.0


【解决方案1】:

根据问题的描述以及cmets和文章"Relaxed Cross-Domain Access Restrictions",我认为最有可能的问题是应用程序在“浏览器内”模式下运行时的访问限制。

要验证您的应用程序是否以受信任的权限运行,您可以检查属性 Application.HasElevatedPermissions 是否为 true

另外,请尝试遵循本指南How to: Enable Trusted Applications to Run Inside the Browser

确保您服务器的防火墙没有阻止“策略服务器”端口943

如果您仍然无法连接到服务器,请尝试将您的服务工作的端口更改为45024534 范围内的某个端口。

【讨论】:

  • 接受这个答案,因为我相信,根据可能被丢弃的不适用的建议解决方案,问题很可能是由于访问限制尚未彻底或正确验证。问题解决后会更新帖子。
【解决方案2】:

对于 Silverlight,您需要一个套接字策略服务器。 详情请看http://msdn.microsoft.com/en-us/library/cc645032%28v=vs.95%29.aspx

【讨论】:

  • 感谢您对文章的引用。我们已经有了这个,问题是我们甚至无法建立与服务器的连接来下载策略文件。
猜你喜欢
  • 1970-01-01
  • 2014-12-22
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2020-05-03
相关资源
最近更新 更多