Silverlight 中的通信安全访问策略
2012-06-17 21:57
267 查看
Silverlight 支持使用 HTTP/HTTPS (System.Net.WebClient 等) 和 Socket (System.Net.Sockets) 两种方式访问远程服务器,但基于安全原因,对这些网络访问制定了严格的安全策略。
1. HTTP/HTTPS 访问策略
(1) 始终允许同域调用。同域是指调用必须使用同一子域、协议和端口,这是出于安全原因以及防止跨域伪造。
(2) Silverlight 支持访问包含跨域策略文件的网站服务。跨域访问时,Silverlight Application 首先在目标 Web 服务的根路径查找 Silverlight 跨域策略文件 (clientaccesspolicy.xml)。如果没找到(404 Not Found)或发生其他错误,将继续在根路径处查找 Flash 跨域策略文件 (crossdomain.xml)。
(3) 所有通信都是异步的。
(4) 仅支持 GET 和 POST 谓词。
(5) 支持大多数标准请求标头和所有自定义请求标头(必须是跨域策略文件中允许的标头)。
(6) 只有 "200 OK" 和 "404 Not Found" 状态代码可用。
我们尝试用 WebClient 访问一个跨域网站。
当目标网站没有提供策略文件时,你会看到如下的错误信息。
在其根路径放置好 clientaccesspolicy.xml 后,访问正常。
2. Sockets 访问策略
创建一个供 Silverlight Application 连接的 Socket Server (非同域网站),必须符合以下安全策略。
(1) 监听 943 端口,为 Silverlight Application 提供策略文件(clientaccesspolicy.xml)。
(2) Socket Server 的服务端口范围必须在 4502 - 4534 之间。这是 Silverlight Application Socket 连接所允许使用的端口范围,否则连接失败。
我们写一个简单的 Time Server 作为演示。
如果不启动服务器策略文件服务,或者端口不是 943,你会在客户端获得一个 AccessDenied 错误。
当然,如果服务器监听端口不再允许范围(4502 - 4534)内,同样也会触发这样一个错误。
【reprinted from http://www.rainsts.net/】
1. HTTP/HTTPS 访问策略
(1) 始终允许同域调用。同域是指调用必须使用同一子域、协议和端口,这是出于安全原因以及防止跨域伪造。
(2) Silverlight 支持访问包含跨域策略文件的网站服务。跨域访问时,Silverlight Application 首先在目标 Web 服务的根路径查找 Silverlight 跨域策略文件 (clientaccesspolicy.xml)。如果没找到(404 Not Found)或发生其他错误,将继续在根路径处查找 Flash 跨域策略文件 (crossdomain.xml)。
clientaccesspolicy.xml <?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from> <domain uri="*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy>
(3) 所有通信都是异步的。
(4) 仅支持 GET 和 POST 谓词。
(5) 支持大多数标准请求标头和所有自定义请求标头(必须是跨域策略文件中允许的标头)。
<?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy > <allow-from http-request-headers="SOAPAction, x-custom-header"> <domain uri="*"/> </allow-from> <grant-to> <resource path="/services/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy>
(6) 只有 "200 OK" 和 "404 Not Found" 状态代码可用。
我们尝试用 WebClient 访问一个跨域网站。
private void Button_Click(object sender, RoutedEventArgs e) { var client = new WebClient(); client.DownloadStringCompleted += (s, ex) => { this.TextBlock1.Text = ex.Error != null ? ex.Error.ToString() : ex.Result; }; client.DownloadStringAsync(new Uri("http://localhost:8081/", UriKind.Absolute)); }
当目标网站没有提供策略文件时,你会看到如下的错误信息。
在其根路径放置好 clientaccesspolicy.xml 后,访问正常。
2. Sockets 访问策略
创建一个供 Silverlight Application 连接的 Socket Server (非同域网站),必须符合以下安全策略。
(1) 监听 943 端口,为 Silverlight Application 提供策略文件(clientaccesspolicy.xml)。
(2) Socket Server 的服务端口范围必须在 4502 - 4534 之间。这是 Silverlight Application Socket 连接所允许使用的端口范围,否则连接失败。
我们写一个简单的 Time Server 作为演示。
Server CUI class Program { static void Main(string[] args) { AccessPolicyServer(); TimeServer(); Console.WriteLine("Press any key to exit..."); Console.ReadKey(true); Environment.Exit(0); } /// <summary> /// 创建时间服务器线程 /// </summary> private static void TimeServer() { new Thread(() => { // 监听 4502 端口 var server = new TcpListener(IPAddress.Parse("127.0.0.1"), 4502); server.Start(); while (true) { var client = server.AcceptTcpClient(); var stream = client.GetStream(); // 发送当前时间 var send = Encoding.UTF8.GetBytes(DateTime.Now.ToString()); stream.Write(send, 0, send.Length); client.Close(); } }).Start(); } /// <summary> /// 创建策略文件服务器线程 /// </summary> private static void AccessPolicyServer() { new Thread(() => { // 监听 943 端口 var server = new TcpListener(IPAddress.Parse("127.0.0.1"), 943); server.Start(); while (true) { var client = server.AcceptTcpClient(); var stream = client.GetStream(); // 读取客户端发送信息,如果请求字符串不匹配则断开。 var buffer = new Byte[1024]; var len = stream.Read(buffer, 0, buffer.Length); var rece = Encoding.UTF8.GetString(buffer, 0, len); if (String.Compare(rece, "<policy-file-request/>", true) != 0) { client.Close(); break; } Console.WriteLine(rece); // 发送策略文件内容 var send = Encoding.UTF8.GetBytes(@" <?xml version=""1.0"" encoding=""utf-8""?> <access-policy> <cross-domain-access> <policy> <allow-from> <domain uri=""*""/> </allow-from> <grant-to> <socket-resource port=""4502-4534"" protocol=""tcp"" /> </grant-to> </policy> </cross-domain-access> </access-policy>"); stream.Write(send, 0, send.Length); client.Close(); } }).Start(); } } Client Silverlight XAP private void Button_Click(object sender, RoutedEventArgs e) { // 创建 Socket var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 创建等待句柄 var wait = new ManualResetEvent(true); // 创建连接参数 var args = new SocketAsyncEventArgs(); args.RemoteEndPoint = new DnsEndPoint("127.0.0.1", 4502); // 订阅处理事件 args.Completed += (s, ex) => { if (ex.LastOperation == SocketAsyncOperation.Connect) { // 连接完成,则设置缓冲区 var buffer = new byte[1024]; ex.SetBuffer(buffer, 0, buffer.Length); // 接收服务器数据 client.ReceiveAsync(ex); } else if (ex.LastOperation == SocketAsyncOperation.Receive) { // 如果接收信息正确,则显示服务器发送内容,否则显示错误信息。 if (ex.SocketError == SocketError.Success) { this.Dispatcher.BeginInvoke(() => { this.TextBlock1.Text = Encoding.UTF8.GetString(ex.Buffer, 0, ex.BytesTransferred); }); } else { this.Dispatcher.BeginInvoke(() => { this.TextBlock1.Text = ex.SocketError.ToString(); }); } wait.Set(); } }; // 连接服务器 client.ConnectAsync(args); // 等待处理结束 wait.WaitOne(); }
如果不启动服务器策略文件服务,或者端口不是 943,你会在客户端获得一个 AccessDenied 错误。
当然,如果服务器监听端口不再允许范围(4502 - 4534)内,同样也会触发这样一个错误。
【reprinted from http://www.rainsts.net/】
相关文章推荐
- Silverlight跨域访问以及安全策略
- \t\t【总结】SilverLight与Wcf HTTP 通信 安全
- 稳扎稳打Silverlight(53) - 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和BrowserHttp
- 稳扎稳打Silverlight(53) - 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和BrowserHttp
- 稳扎稳打Silverlight(53) - 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和BrowserHttp
- 目标程序集不包含服务类型。可能需要调整此程序集的代码访问安全策略
- windows Server 2003 使用 ip安全策略 禁止某ip访问服务器
- app的java后端接口的安全访问策略
- 稳扎稳打Silverlight(53) - 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和BrowserHttp
- 稳扎稳打Silverlight(53) - 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和BrowserHttp
- 稳扎稳打Silverlight(53) - 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和BrowserHttp
- Flash Socket通信的安全策略问题 843端口
- 利用IP安全策略阻止访问特定的IP网段共享文件夹
- Silverlight 2学习教程(十):Silverlight 2.0 URL 访问策略
- Silverlight 2 教程(十):Silverlight 2.0 URL 访问策略
- [教程] Flash Socket通信的安全策略问题 843端口
- [置顶] Android系统访问控制之Smack安全策略设计与实现
- 基于加密机制的WebService访问与通信安全
- 稳扎稳打Silverlight(53) - 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和BrowserHttp
- 稳扎稳打Silverlight(53) - 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和BrowserHttp