如何使用 AllowPartiallyTrustedCallers 属性调用具有通过使用 Visual C#.net、 Visual C# 2005年或更高版本的 Web 页上的强名称程序集

文章翻译 文章翻译
文章编号: 839300 - 查看本文应用于的产品
重要本文包含如何帮助降低安全设置或如何关闭计算机上的安全功能为您显示的信息。您可以通过这些更改来解决特定问题。您在进行这些更改之前,我们建议您考虑在您的特定环境中实施该替代方法带来的风险。如果实施该替代方法,采取任何适当的附加措施来帮助保护您的系统。
展开全部 | 关闭全部

本文内容

概要

您可能需要从 Web 页中调用一个 Windows 用户控件。若要调用一个 Windows 控件,用户控件的可访问受保护的资源和作为具有强名称程序集生成时的您必须标记 AllowPartiallyTrusted 程序集属性与 Windows 用户控件的程序集。您还必须包括在调用 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 命令提示窗口中显示。

    在 Microsoft Visual Studio.net 2003年中单击 开始、 指向 程序、 指向 Microsoft Visual Studio.net 2003年、 指向 Visual Studio.net 工具,然后单击 Visual Studio.net 2003年命令提示符。Visual Studio.net 2003年命令提示窗口中显示。

    可视有关 Studio 的 2005 年单击 开始、 指向 程序、 指向 Microsoft Visual Studio 2005、 指向 Visual Studio 2005 工具,然后单击 Visual Studio 2005 命令提示符。Visual Studio 2005 命令提示窗口中显示。

    在可视有关 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 方法。 方法必须遵循 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 框架配置。在 .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. 单击 使用现有权限设置、 从在列表中选择 FullTrust,然后单击 下一步。 此时会出现 正在完成向导 页面。
  12. 单击 完成 关闭创建代码组向导。

创建一个 HTML 文件,以调用用户控件

创建一个代码组以分配为程序集的权限后,您必须创建要从浏览器,调用用户控件的 HTML 文件,您必须设置环境以确保用户控件调用成功。
  1. 单击 开始,单击 运行,键入 记事本,然后单击 确定
  2. 在记事本,中粘贴以下代码:
    <OBJECT id="MyWinControl1" height="200" width="200" classid="http:UserControl.dll#UserControl.UserControl1" VIEWASTEXT>
        
    </OBJECT> 
  3. Microsoft Internet Information Services (IIS) 根文件夹中将文件另存为 CallUserControl.htm。
  4. 在 IIS 根文件夹"创建使用 Microsoft Visual C#.net、 Microsoft Visual C# 2005 或更高版本的 Windows 用户控件"一节中创建 UserControl.dll 文件复制。
  5. 打开 Microsoft Internet Explorer。
  6. 地址 框中键入 http://localhost/CallUserControl.htm,然后按 ENTER 键。在 打开 对话框出现。
  7. 找到任何文本文件,然后单击 打开。 在浏览器上 列表框 控件中显示文件的文本。

参考

有关更多的信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:
配置代码组使用.net 框架配置工具
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

安全简介: 强名称和.net 框架中的安全
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 标准版
  • Microsoft Visual C# 2008 Express Edition
关键字:?
kbmt kbhowtomaster kbhowto kblistbox kbfileio kbdll kbcontrol kbweb kbuser kbsecurity kbpolicy kbopenfile KB839300 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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