自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

創(chuàng)建Silverlight 5瀏覽器內(nèi)受信應(yīng)用

開發(fā) 后端
可以看到,在Silverlight 5中受信應(yīng)用的權(quán)限幾乎獲得了與桌面應(yīng)用相當(dāng)?shù)臋?quán)限,在這里,我將為大家介紹如何創(chuàng)建瀏覽器內(nèi)的受信應(yīng)用。以下示例將通過Silverlight來監(jiān)視本地的網(wǎng)絡(luò)流量。

  在Silverlight 4中受信應(yīng)用已經(jīng)被支持,受信應(yīng)用簡單的說就是可以訪問一些本地受限資源的Silverlight應(yīng)用。在Silverlight 4中受信應(yīng)用必須是OOB類型,即必須先安裝在本地,同時受信應(yīng)用能訪問的資源也有限,例如只能訪問我的文檔、我的圖片等位置的文件。而在Silverlight 5中受信應(yīng)用的功能做了很大的改進(jìn)和增強(qiáng):

  受信應(yīng)用可以運行于瀏覽器之內(nèi)

  可以無限制的訪問本地文件系統(tǒng)

  訪問強(qiáng)安全性方法時,不會再引發(fā)MethodAccessException異常

  當(dāng)運行于桌面模式時,可以創(chuàng)建多個窗口

  在Windows平臺可以直接調(diào)用非托管函數(shù)

  可以看到,在Silverlight 5中受信應(yīng)用的權(quán)限幾乎獲得了與桌面應(yīng)用相當(dāng)?shù)臋?quán)限,在這里,我將為大家介紹如何創(chuàng)建瀏覽器內(nèi)的受信應(yīng)用。以下示例將通過Silverlight來監(jiān)視本地的網(wǎng)絡(luò)流量。

  受信應(yīng)用的創(chuàng)建與常規(guī)Silverlight應(yīng)用沒有差異,直接通過新建項目來創(chuàng)建:

  要使應(yīng)用受信任,必須修改項目的屬性,必須勾選“允許在瀏覽器外允許程序”,以及“在瀏覽器內(nèi)運行時需要提升的權(quán)限”:

  單擊瀏覽器外設(shè)置按鈕,進(jìn)入以下設(shè)置界面,勾選“在瀏覽器之外運行時需要提升的信任”,由于我們的應(yīng)用只允許在瀏覽器內(nèi)運行,所以可將“顯示安裝菜單”的復(fù)選框去掉。這里說明一下,由于受信應(yīng)用在Silverlight之前版本是和瀏覽器外運行綁定的,所以這里我們可以看到,雖然現(xiàn)在不使用瀏覽器外運行方式,但也需要對OOB進(jìn)行設(shè)置,以此來獲取受信模式。

  實現(xiàn)功能。我們將調(diào)用非托管的Win32 API來實現(xiàn)本地網(wǎng)絡(luò)流量的監(jiān)視,在Silverlight 5中,調(diào)用本地非托管函數(shù)的方式與.NET下完全一致。具體請參照本文源碼,代碼片段:

  1. public static class WIN32API  
  2.     {  
  3.         [DllImport("kernel32.dll")]  
  4.         public static extern bool GetComputerName(StringBuilder computerName, out Int32 nameLength);  
  5.  
  6.         [DllImport("Iphlpapi.dll")]  
  7.         private static extern Int32 GetIfTable(Byte[] pIfTable, out long pdwSize, bool bOrder);  
  8.  
  9.         [DllImport("kernel32.dll")]  
  10.         private static extern  int MultiByteToWideChar(uint CodePage,Int32 dwFlags,byte[] lpMultiByteStr,Int32 cbMultiByte,byte[] lpWideCharStr, int cchWideChar);  
  11.  
  12.         public static MIB_IFTABLE GetIfTable()  
  13.         {  
  14.             MIB_IFTABLE table = new MIB_IFTABLE();  
  15.             long size = 0;  
  16.             GetIfTable(nullout size, false);  
  17.             if (size != 0)  
  18.             {  
  19.                 Byte[] data = new Byte[size];  
  20.                 long ret = GetIfTable(data, out size, false);  
  21.                 if (ret == 0)  
  22.                 {  
  23.                     MemoryStream ms = new MemoryStream(data);  
  24.                     ms.Position = 0;  
  25.                     BinaryReader br = new BinaryReader(ms, Encoding.Unicode);  
  26.  
  27.                     table.dwNumEntries = br.ReadInt32();  
  28.                     table.table = new MIB_IFROW[table.dwNumEntries];  
  29.                     for (int i = 0; i < table.dwNumEntries; i++)  
  30.                     {  
  31.                         table.table[i] = new MIB_IFROW();  
  32.                         MIB_IFROW curRow = table.table[i];  
  33.                         FieldInfo[] fis = typeof(MIB_IFROW).GetFields();  
  34.                         foreach (FieldInfo fi in fis)  
  35.                         {  
  36.                             if (!fi.IsStatic)  
  37.                             {  
  38.                                 MarshalAsAttribute[] attrs = fi.GetCustomAttributes(typeof(MarshalAsAttribute), trueas MarshalAsAttribute[];  
  39.                                 if (attrs != null && attrs.Length > 0 && attrs[0].SizeConst != 0)  
  40.                                 {  
  41.  
  42.                                     if (fi.FieldType == typeof(String))  
  43.                                     {  
  44.                                         Byte[] tmpChars = br.ReadBytes(attrs[0].SizeConst*2);  
  45.                                         fi.SetValue(curRow, Encoding.Unicode.GetString(tmpChars, 0, tmpChars.Length).TrimEnd('\0'));  
  46.                                     }  
  47.                                     else if (fi.FieldType == typeof(Byte[]))  
  48.                                     {  
  49.                                         fi.SetValue(curRow, br.ReadBytes(attrs[0].SizeConst));  
  50.                                     }  
  51.                                 }  
  52.                                 else 
  53.                                 {  
  54.                                     if (fi.FieldType == typeof(Int32))  
  55.                                     {  
  56.                                         Int32 tmpValue = br.ReadInt32();  
  57.                                         fi.SetValue(curRow, tmpValue);  
  58.                                     }  
  59.                                 }  
  60.  
  61.                             }  
  62.                         }  
  63.                     }  
  64.                 }  
  65.             }  
  66.  
  67.             return table;  
  68.         }  
  69.  
  70.         public static String AsciiToUTF8(Byte[] asciiBytes)  
  71.         {  
  72.             int mustBytes = MultiByteToWideChar(WIN32CONST.CP_ACP, WIN32CONST.MB_PRECOMPOSED, asciiBytes, -1, null, 0);  
  73.             if (mustBytes > 0)  
  74.             {  
  75.                 Byte[] tmpBytes = new Byte[mustBytes*2];  
  76.                 if (MultiByteToWideChar(WIN32CONST.CP_ACP, WIN32CONST.MB_PRECOMPOSED, asciiBytes, -1, tmpBytes, mustBytes) != 0)  
  77.                 {  
  78.                    return Encoding.Unicode.GetString(tmpBytes, 0, tmpBytes.Length);  
  79.                 }  
  80.             }  
  81.             return "";  
  82.         }  
  83.     } 


 

 

 

 

  1. 測試,當(dāng)在本地測試時,即訪問地址為localhost或127.0.0.1時,受信應(yīng)用無需做任何設(shè)置即可運行,本示例運行結(jié)果如下:
    4
  2. 接下來我們將說明如何部署受信應(yīng)用,首先,要使受信應(yīng)用在遠(yuǎn)程客戶機(jī)上被訪問,必須對xap進(jìn)行簽名。
  3. 進(jìn)入TrustedApp項目屬性,轉(zhuǎn)到簽名頁,勾選“為Xap文件簽名”,這里我們將創(chuàng)建一個新的測試證書,以此進(jìn)行演示,實際項目中可以向證書頒發(fā)機(jī)構(gòu)申請信任證書,當(dāng)然這是需要$的。單擊創(chuàng)建新測試證書按鈕,在彈出對話框中輸入密碼,這里設(shè)置為test,確定后,Visual Studio將創(chuàng)建一個證書文件,默認(rèn)保存在項目根目錄下。
    5
  4. 接下來單擊“從存儲區(qū)選擇”按鈕,在彈出窗口中選擇剛才創(chuàng)建的證書
    6
  5. 在簽名頁面,單擊“更多詳細(xì)信息”按鈕,將會顯示證書的詳細(xì)信息,選擇詳細(xì)信息標(biāo)簽,然后單擊“復(fù)制到文件”按鈕,進(jìn)入證書導(dǎo)出向?qū)В?br /> 7 
  6. 進(jìn)入以下頁面后,選擇不要導(dǎo)出私鑰:
  7. 8 
  8. 此步驟導(dǎo)出的證書供客戶端使用!
  9. 完成后重新生成解決方案
  10. 將受信應(yīng)用部署到IIS,部署與傳統(tǒng)ASP.NET應(yīng)用一樣,無需做其他設(shè)置。
  11. 以上基本完成了服務(wù)端的設(shè)置,接下來對于客戶端需要做一些設(shè)置,才能在瀏覽器內(nèi)運行受信應(yīng)用
  12. 首先需要啟用瀏覽器內(nèi)受信應(yīng)用權(quán)限,這可直接通過修改注冊表來完成:
    注冊表路徑:HKEY_LOCAL_MACHINE\Software\Microsoft\Silverlight\
    值名稱:AllowElevatedTrustAppsInBrowser
    值類型:DWORD
    可用值:不可在瀏覽器內(nèi)運行受信應(yīng)用,設(shè)置為0,如果啟用設(shè)置為1
  13. 在客戶端安裝第9步驟導(dǎo)出的證書,在證書文件上單擊右鍵,選擇安裝,進(jìn)入證書安裝向?qū)?,選擇存儲區(qū)時,將證書導(dǎo)入到“受信任的發(fā)布者”位置:
    9
  14. 重復(fù)第14步驟,選擇存儲區(qū)時,將證書導(dǎo)入到“受信任的根證書頒發(fā)機(jī)構(gòu)”位置。
  15. 到此,我們即可在此客戶端上運行受信應(yīng)用了(注意下圖中的地址已經(jīng)是非本機(jī)地址):
    10
  16. 但是,必須注意此時的Silverlight是沒辦法自動更新的,也就是說服務(wù)端xap更新后,客戶端重新訪問時不會去自動下載xap,這顯然不符合需求,那該怎么做呢?我們需要在每次生成xap的時候,自動對xap進(jìn)行時間戳簽名。
  17. 進(jìn)入到TrustedApp項目屬性,選擇生成事件:
    11
    在后期生成事件命令行中輸入以下命令,進(jìn)行xap的時間戳簽名:
    "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\signtool.exe" sign /v /f "$(ProjectDir)TrustedApp_1_TemporaryKey.pfx" /p test /t http://timestamp.comodoca.com/authenticode $(TargetName).xap
    前面為signtool的全路徑,它通常位于所安裝的Windows SDK目錄下, /f 后面跟隨證書的全路徑,以上示例表示當(dāng)前項目下的TrustedApp_1_TemporaryKey.pfx證書文件,/p 后面表示證書的密碼,/t 后面跟隨一個CA Authenticode Timestamping Service的URL地址,命令***部分為需要簽名的xap文件。
    進(jìn)行此步操作后,每次生成xap文件后,Visual Studio將自動調(diào)用次命令進(jìn)行xap的時間戳簽名。這樣,客戶端重新訪問網(wǎng)頁時,即可自動下載更新xap。

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-12-31 15:58:11

Silverlight

2009-03-26 15:35:22

detachedRIASilverligh

2011-09-29 14:16:13

通信展手機(jī)Html5

2009-02-19 09:42:01

SliverlightChrome微軟

2012-05-17 09:45:30

2009-03-22 10:08:25

SilverLight瀏覽器

2009-12-30 18:07:54

Silverlight

2009-12-15 13:47:33

Silverlight

2021-06-02 06:14:50

Nyxt瀏覽器

2012-04-25 14:06:45

HTML5

2012-05-28 13:09:12

HTML5

2012-05-07 14:24:15

HTML 5Web App

2020-10-29 09:45:58

零日漏洞Chrome攻擊

2009-08-20 09:18:27

Silverlight

2012-03-20 11:07:08

2012-03-19 17:25:22

2012-03-20 11:41:18

海豚瀏覽器

2012-03-20 11:31:58

移動瀏覽器

2013-11-13 10:05:15

移動瀏覽器HTML 5

2012-04-23 13:43:02

HTML5瀏覽器
點贊
收藏

51CTO技術(shù)棧公眾號