如何使用 AllowPartiallyTrustedCallers 屬性,呼叫具有強式名稱在網頁中的使用 Visual C#.NET、 Visual C# 2005年或更新版本的組件

文章翻譯 文章翻譯
文章編號: 839300 - 檢視此文章適用的產品。
重要本文將告訴您,如何協助降低安全性設定或如何關閉電腦上的安全性功能的資訊。您可以進行這些變更,解決特定問題。進行這些變更之前,我們建議您先評估在特定環境中實作這項因應措施相關聯的風險。如果您要實作這項因應措施,採用任何其他的適當步驟,以協助保護您的系統。
全部展開 | 全部摺疊

在此頁中

結論

可能會想要呼叫 Windows 使用者控制項在網頁中。若要呼叫 Windows 使用者控制項,可以存取安全的資源和,建立為具有強式名稱的組件,您必須將標記 Windows 使用者控制項與 AllowPartiallyTrusted 組件屬性的組件。您也必須包含呼叫 Assert 方法,讓 Windows 使用者控制項,來存取 受保護資源。

簡介

本文將逐步告訴您,如何呼叫一個 Windows 從 Web 網頁的使用者控制項。本文將告訴您的 Windows 使用者控制項建置為具有強式名稱的組件。本文中的範例說明如何使用 AllowPartiallyTrustedCallers 屬性之組件,讓具有強式名稱的組件可以從網頁存取。範例文件中的也說明如何使用 Assert 方法。

建立具有強式名稱的金鑰組

具有強式名稱的金鑰組用來簽署組件具有強式名稱的使用者控制項。建立會使用從部分受信任程式碼組件的權限授與的程式碼群組時,會使用強式名稱。
  1. 開啟 Visual Studio 命令提示字元。

    在 Microsoft Visual Studio.NET 2002,請按一下 [開始]、 指向 [程式集]、 指向 Microsoft Visual Studio.NET、 指向 Visual Studio.NET 工具,] 然後按一下 [Visual Studio.NET 命令提示字元。Visual Studio.NET 命令提示字元] 視窗隨即出現。

    在 Visual Studio.NET 2003 Microsoft,請按一下 [開始]、 指向 [程式集]、 指向 Microsoft Visual Studio.NET 2003年、 指向 Visual Studio.NET 工具,] 然後按一下 [Visual Studio.NET 2003年命令提示字元。[Visual Studio.NET 2003年命令提示字元] 視窗隨即出現。

    在 Visual 的 Studio 2005 中按一下 [開始],指向 [程式集]、 指向 Microsoft Visual Studio 2005、 指向 Visual Studio 2005 工具,然後再按一下 [Visual Studio 2005 命令提示字元]。[Visual Studio 2005 命令提示字元] 視窗隨即出現。

    Visual 的 Studio 2008 中按一下 [開始],指向 [程式集]、 指向 [Microsoft Visual Studio 2008、 指向 Visual Studio 2008 工具,然後再按一下 [Visual Studio 2008 命令提示字元]。[Visual Studio 2008Command 提示視窗便會出現。
  2. 請在命令提示字元下輸入下列並按下 ENTER:
    sn-k c:\snKey.snk

使用 Microsoft Visual C#.NET,Microsoft Visual C# 2005 或更新版本的方式來建立 Windows 使用者控制項

警告這項因應措施可能會使您的電腦] 或 [網路更容易遭受] 攻擊惡意使用者或惡意軟體 (例如病毒)。我們不建議這項因應措施,但會提供這項資訊,如此您可以在您自己慎重實作這項因應措施。這項因應措施您必須承擔使用自己的風險。

這個使用者控制項示範如何使用 AllowPartiallyTrustedCallers 屬性的組件。只可由完全受信任的呼叫端呼叫具有強式名稱的組件,除非組件使用 AllowPartiallyTrustedCallers 屬性。使用者控制項的範例也示範如何使用 Assert 方法。Assert 方法宣告呼叫程式碼可以使用程式碼會呼叫 Assert 方法來存取受使用權限要求的資源。程式碼可以存取的資源,即使堆疊中較高層的呼叫端尚未授與存取資源的權限。

這個使用者控制項可讓您使用 [開啟] 對話方塊來選取檔案。控制項然後在清單方塊開啟文字檔案。這個使用者控制項的使用者介面包括一個文字方塊和一個清單方塊。[文字] 方塊顯示已選取的檔案名稱並清單方塊顯示已選取的檔案的內容。

OpenFileDialog] 方塊讀取選取的檔案名稱,並讀取檔案 FileIOPermission 必須被授與權限類型。該使用者控制項必須透過其程式碼群組授與這個使用權限。呼叫控制項的網頁並不具有此使用權限。

若要防止不成功,因為呼叫端沒有必要的 FileIOPermission 權限類型的堆疊查核行程,使用 Assert 方法。注意是否 Assert 方法使用不正確或不當 Assert 方法可以開啟安全性漏洞。因此,您必須使用 Assert 方法非常小心。RevertAssert 方法必須遵循 Assert 方法,一旦完成檔案作業。

附註若要確定檔案的內容正確地出現在清單方塊中,使用這個使用者控制項選取只有文字檔案。
  1. 啟動 Microsoft Visual Studio.NET、 Microsoft Visual Studio 2005 或更新版本的 Visual Studio。
  2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。出現 [新增專案] 對話方塊。
  3. 在 [專案類型 下, 按一下 [Visual C# 專案]。

    附註在 Visual Studio 按一下 Visual C#專案類型] 下。
  4. 在 [範本 下, 按一下 Windows 控制項程式庫
  5. 在 [名稱] 方塊中,鍵入 使用者控制項
  6. 按一下 [確定]
  7. 方案總管] 視窗中 UserControl1.cs,] 上按一下滑鼠右鍵,然後按一下 [檢視程式碼。 UserControl1.cs 檔案就會出現。
  8. 現有的程式碼取代下列程式碼:
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Windows.Forms;
    using System.IO;
    using System.Security;
    using System.Security.Permissions;
    using System.Reflection;
    using System.Runtime.CompilerServices;
    
    [assembly:AllowPartiallyTrustedCallers]
    
    namespace UserControl
    {
    	/// <summary>
    	/// Summary description for UserControl1.
    	/// </summary>
    	public class UserControl1 : System.Windows.Forms.UserControl
    	{
    		private System.Windows.Forms.TextBox textBox1;
    		private System.Windows.Forms.ListBox listBox1;
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		private System.ComponentModel.Container components = null;
    
    		public UserControl1()
    		{
    			// This call is required by the Windows.Forms Form Designer.
    			InitializeComponent();
    
    			// TODO: Add any initialization after the InitForm call.
    			OpenFileDialog fileDialog = new OpenFileDialog();
    			if(fileDialog.ShowDialog() == DialogResult.OK)
    			{
    				// Reading the name of the selected file from the OpenFileDialog box
    				// and reading the file requires FileIOPermission.   
    				// The Assert command must be followed by a RevertAssert as soon as the file operation 
    				// is completed.
    				new FileIOPermission(PermissionState.Unrestricted).Assert();
    				textBox1.Text = fileDialog.FileName;
    				// Display the contents of the file in the text box.
    				FileStream fsIn = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read, 
    					FileShare.Read);
    				StreamReader sr = new StreamReader(fsIn);
    			
    				// Process every line in the file.
    				for (String Line = sr.ReadLine(); Line != null; Line = sr.ReadLine()) 
    				{
    					listBox1.Items.Add(Line);
    				}
    				// It is very important to call RevertAssert to restore the stack walk for
    				// file operations.
    				FileIOPermission.RevertAssert();
    			}
    
    		}
    
    		/// <summary>
    		/// Clean up any resources that are being used.
    		/// </summary>
    		protected override void Dispose( bool disposing )
    		{
    			if( disposing )
    			{
    				if( components != null )
    					components.Dispose();
    			}
    			base.Dispose( disposing );
    		}
    
    		#region Component Designer generated code
    		/// <summary>
    		/// Required method for Designer support. Do not modify 
    		/// the contents of this method with the code editor.
    		/// </summary>
    		private void InitializeComponent()
    		{
    			this.textBox1 = new System.Windows.Forms.TextBox();
    			this.listBox1 = new System.Windows.Forms.ListBox();
    			this.SuspendLayout();
    			// 
    			// textBox1
    			// 
    			this.textBox1.Location = new System.Drawing.Point(32, 16);
    			this.textBox1.Name = "textBox1";
    			this.textBox1.TabIndex = 0;
    			this.textBox1.Text = "textBox1";
    			// 
    			// listBox1
    			// 
    			this.listBox1.Location = new System.Drawing.Point(144, 16);
    			this.listBox1.Name = "listBox1";
    			this.listBox1.Size = new System.Drawing.Size(120, 95);
    			this.listBox1.TabIndex = 1;
    			// 
    			// UserControl1
    			// 
    			this.Controls.Add(this.listBox1);
    			this.Controls.Add(this.textBox1);
    			this.Name = "UserControl1";
    			this.Size = new System.Drawing.Size(376, 120);
    			this.ResumeLayout(false);
    
    		}
    		#endregion
    			}
    }
    
  9. 在 [方案總管] 中 AssemblyInfo.cs,] 上按一下滑鼠右鍵,然後按一下 [檢視程式碼。 AssemblyInfo.cs 檔案就會出現。
  10. 找出下列程式碼:
    [assembly: AssemblyVersion("1.0.*")]
    取代成下列程式碼的這段程式碼:
    [assembly: AssemblyVersion("1.0.0.0")]
  11. 找出下列程式碼:
    [assembly: AssemblyKeyFile("")]
    取代成下列程式碼的這段程式碼:
    [assembly: AssemblyKeyFile("c:\\snKey.snk")]
  12. 在 [建置] 功能表上按一下 建置方案

建立指定組件的權限的程式碼群組

警告這項因應措施可能會使您的電腦] 或 [網路更容易遭受] 攻擊惡意使用者或惡意軟體 (例如病毒)。我們不建議這項因應措施,但會提供這項資訊,如此您可以在您自己慎重實作這項因應措施。這項因應措施您必須承擔使用自己的風險。

程式碼群組會判斷組件是否符合成員資格條件指的系統管理員定義準則。如果組件符合,程式碼群組授與組件已經與該程式碼群組產生關聯的使用權限集合。

若要建立程式碼群組:
  1. 按一下 [開始],指向 [設定],然後再按一下 [控制台]。[控制台] 視窗隨即出現。
  2. 連按兩下 [系統管理工具]。[系統管理工具] 視窗隨即出現。
  3. 在 Microsoft Visual Studio.NET 2002,按兩下 Microsoft.NET Framework 組態.NET Framework 組態 視窗隨即出現。

    Microsoft Visual Studio.NET 2003,連按兩下 Microsoft.NET Framework 1.1 組態。[.NET 組態 1.1] 視窗隨即出現。

    在 Microsoft Visual Studio 2005 或更新版本中,連按兩下 [Microsoft.NET Framework 2.0 設定]。.NET Framework 2.0 組態 視窗隨即出現。
  4. 在左窗格中展開 執行階段安全性原則]、 展開 電腦,然後再展開 [程式碼群組]。
  5. All_Code,] 上按一下滑鼠右鍵,然後按一下 [新增]。建立程式碼群組精靈隨即出現。
  6. 請確定已選取 建立新的程式碼群組,在 [名稱] 方塊中中, 輸入 MyUserControlCodeGroup,再按 下一步]。[選擇條件類型] 頁面便會出現。
  7. 在 [選擇條件類型,此程式碼群組] 清單中,按一下 強式名稱
  8. 按一下 [匯入]。組匯入強式名稱寄件] 對話方塊隨即出現。
  9. 找出您在 「 建立使用 Microsoft Visual C#.NET、 Microsoft Visual C# 2005年或更新版本的 Windows 使用者控制項 」] 小節建立 UserControl.dll 檔案,然後按一下 [開啟舊檔]。
  10. 按一下 [下一步]。[指派使用權限集合至程式碼群組] 頁面便會出現。
  11. 按一下 [使用現有的使用權限集合,從該清單中選取 [完全信任 再然後按一下 [下一步]。 [正在完成精靈] 頁面便會出現。
  12. 按一下 [完成] 關閉建立程式碼群組精靈]。

建立 HTML 檔案,以呼叫使用者控制項

建立指定組件的權限的程式碼群組之後,您必須建立要從瀏覽器呼叫使用者控制項的 HTML 檔案,並您必須設定環境來確定使用者控制項呼叫成功。
  1. 按一下 [開始]、 按一下 [執行]、 輸入 記事本,然後按一下 [確定]]。
  2. 在 [記事本] 中, 貼上下列程式碼:
    <OBJECT id="MyWinControl1" height="200" width="200" classid="http:UserControl.dll#UserControl.UserControl1" VIEWASTEXT>
        
    </OBJECT> 
  3. 在根資料夾的 Microsoft 網際網路資訊服務 (IIS) 將檔案儲存為 CallUserControl.htm。
  4. 複製您在 < 建立使用 Microsoft Visual C#.NET、 Microsoft Visual C# 2005年或更新版本的 Windows 使用者控制項 > 一節到 IIS 根資料夾中建立 UserControl.dll 檔案。
  5. 開啟 Microsoft Internet Explorer。
  6. 在 [網址] 方塊中鍵入 http://localhost/CallUserControl.htm,並按下 ENTER。[開啟舊檔] 對話方塊隨即出現。
  7. 找出任何文字檔,並按一下 [開啟舊檔]。 檔案的文字會出現在瀏覽器上的 [清單方塊] 控制項。

?考

如需詳細資訊請造訪下列 Microsoft 開發人員網路 (MSDN) 網站:
設定使用.NET Framework 組態工具的程式碼群組
http://msdn2.microsoft.com/en-us/library/eb8xw74a(vs.71).aspx

CodeAccessPermission.assert 方法
http://msdn2.microsoft.com/en-us/library/system.security.codeaccesspermission.assert(vs.71).aspx

.NET 架構組件和 AllowPartiallyTrustedCallers 屬性
http://msdn2.microsoft.com/en-us/library/aa302328.aspx

AllowPartiallyTrustedCallersAttribute 類別
http://msdn2.microsoft.com/en-us/library/system.security.allowpartiallytrustedcallersattribute(vs.71).aspx

組件安全性考量
http://msdn2.microsoft.com/en-us/library/ab4eace3(vs.71).aspx

安全性 briefs: 強式名稱和.NET Framework 的安全性
http://msdn2.microsoft.com/en-us/library/aa302416.aspx

屬性

文章編號: 839300 - 上次校閱: 2008年7月15日 - 版次: 4.1
這篇文章中的資訊適用於:
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 標準版
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2008 Express Edition
關鍵字:?
kbmt kbhowtomaster kbhowto kblistbox kbfileio kbdll kbcontrol kbweb kbuser kbsecurity kbpolicy kbopenfile KB839300 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:839300
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com