网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > Silverlight > 正文

Silverlight中的通信安全访问策略

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

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)。
clientaccesspolicy.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <access-policy> 
  3.   <cross-domain-access> 
  4.     <policy> 
  5.       <allow-from> 
  6.         <domain uri="*"/> 
  7.       </allow-from> 
  8.       <grant-to> 
  9.         <resource path="/" include-subpaths="true"/> 
  10.       </grant-to> 
  11.     </policy> 
  12.   </cross-domain-access> 
  13. </access-policy> 

(3) 所有通信都是异步的。

(4) 仅支持 GET 和 POST 谓词。

(5) 支持大多数标准请求标头和所有自定义请求标头(必须是跨域策略文件中允许的标头)。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <access-policy> 
  3.   <cross-domain-access> 
  4.     <policy > 
  5.       <allow-from http-request-headers="SOAPAction, x-custom-header"> 
  6.         <domain uri="*"/> 
  7.       </allow-from> 
  8.       <grant-to> 
  9.         <resource path="/services/" include-subpaths="true"/> 
  10.       </grant-to> 
  11.     </policy> 
  12.   </cross-domain-access> 
  13. </access-policy> 

(6) 只有 "200 OK" 和 "404 Not Found" 状态代码可用。

我们尝试用 WebClient 访问一个跨域网站。

  1. private void Button_Click(object sender, RoutedEventArgs e) 
  2.   var client = new WebClient(); 
  3.  
  4.   client.DownloadStringCompleted += (s, ex) => 
  5.   { 
  6.     this.TextBlock1.Text = ex.Error != null ? ex.Error.ToString() : ex.Result; 
  7.   }; 
  8.  
  9.   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

  1. class Program 
  2.   static void Main(string[] args) 
  3.   { 
  4.     AccessPolicyServer(); 
  5.     TimeServer(); 
  6.  
  7.     Console.WriteLine("Press any key to exit"); 
  8.     Console.ReadKey(true); 
  9.     Environment.Exit(0); 
  10.   } 
  11.  
  12.   /// <summary> 
  13.   /// 创建时间服务器线程 
  14.   /// </summary> 
  15.   private static void TimeServer() 
  16.   { 
  17.     new Thread(() => 
  18.     { 
  19.       // 监听 4502 端口 
  20.       var server = new TcpListener(IPAddress.Parse("127.0.0.1"), 4502); 
  21.       server.Start(); 
  22.  
  23.       while (true
  24.       { 
  25.         var client = server.AcceptTcpClient(); 
  26.         var stream = client.GetStream(); 
  27.  
  28.         // 发送当前时间 
  29.         var send = Encoding.UTF8.GetBytes(DateTime.Now.ToString()); 
  30.         stream.Write(send, 0, send.Length); 
  31.         client.Close(); 
  32.       } 
  33.     }).Start(); 
  34.   } 
  35.  
  36.   /// <summary> 
  37.   /// 创建策略文件服务器线程 
  38.   /// </summary> 
  39.   private static void AccessPolicyServer() 
  40.   { 
  41.     new Thread(() => 
  42.     { 
  43.       // 监听 943 端口 
  44.       var server = new TcpListener(IPAddress.Parse("127.0.0.1"), 943); 
  45.       server.Start(); 
  46.  
  47.       while (true
  48.       { 
  49.         var client = server.AcceptTcpClient(); 
  50.         var stream = client.GetStream(); 
  51.          
  52.         // 读取客户端发送信息,如果请求字符串不匹配则断开。 
  53.         var buffer = new Byte[1024]; 
  54.         var len = stream.Read(buffer, 0, buffer.Length); 
  55.  
  56.         var rece = Encoding.UTF8.GetString(buffer, 0, len); 
  57.         if (String.Compare(rece, "<policy-file-request/>"true) != 0) 
  58.         { 
  59.           client.Close(); 
  60.           break
  61.         } 
  62.  
  63.         Console.WriteLine(rece); 
  64.  
  65.         // 发送策略文件内容 
  66.         var send = Encoding.UTF8.GetBytes(@" 
  67.           <?xml version=""1.0"" encoding=""utf-8""?> 
  68.           <access-policy> 
  69.             <cross-domain-access> 
  70.               <policy> 
  71.                 <allow-from> 
  72.                   <domain uri=""*""/> 
  73.                 </allow-from> 
  74.                 <grant-to> 
  75.                   <socket-resource port=""4502-4534"" protocol=""tcp"" /> 
  76.                 </grant-to> 
  77.               </policy> 
  78.             </cross-domain-access> 
  79.           </access-policy>"); 
  80.  
  81.         stream.Write(send, 0, send.Length); 
  82.  
  83.         client.Close(); 
  84.       } 
  85.     }).Start(); 
  86.   } 
  87.  
  88. //Client Silverlight XAP  
  89.  
  90. private void Button_Click(object sender, RoutedEventArgs e) 
  91.   // 创建 Socket 
  92.   var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  93.  
  94.   // 创建等待句柄 
  95.   var wait = new ManualResetEvent(true); 
  96.    
  97.   // 创建连接参数 
  98.   var args = new SocketAsyncEventArgs(); 
  99.   args.RemoteEndPoint = new DnsEndPoint("127.0.0.1", 4502); 
  100.  
  101.   // 订阅处理事件 
  102.   args.Completed += (s, ex) =>  
  103.   { 
  104.     if (ex.LastOperation == SocketAsyncOperation.Connect) 
  105.     { 
  106.       // 连接完成,则设置缓冲区 
  107.       var buffer = new byte[1024]; 
  108.       ex.SetBuffer(buffer, 0, buffer.Length); 
  109.  
  110.       // 接收服务器数据 
  111.       client.ReceiveAsync(ex); 
  112.     } 
  113.     else if (ex.LastOperation == SocketAsyncOperation.Receive) 
  114.     { 
  115.       // 如果接收信息正确,则显示服务器发送内容,否则显示错误信息。 
  116.       if (ex.SocketError == SocketError.Success) 
  117.       { 
  118.         this.Dispatcher.BeginInvoke(() => 
  119.         { 
  120.           this.TextBlock1.Text = Encoding.UTF8.GetString(ex.Buffer, 0, ex.BytesTransferred); 
  121.         }); 
  122.       } 
  123.       else 
  124.       { 
  125.         this.Dispatcher.BeginInvoke(() => 
  126.         { 
  127.           this.TextBlock1.Text = ex.SocketError.ToString(); 
  128.         }); 
  129.       } 
  130.  
  131.       wait.Set(); 
  132.     } 
  133.   }; 
  134.  
  135.   // 连接服务器 
  136.   client.ConnectAsync(args); 
  137.   // 等待处理结束 
  138.   wait.WaitOne(); 

如果不启动服务器策略文件服务,或者端口不是 943,你会在客户端获得一个 AccessDenied 错误。
当然,如果服务器监听端口不再允许范围(4502 - 4534)内,同样也会触发这样一个错误。

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师