原文 http://support.microsoft.com/kb/839300/zh-cn
重要
本文向您显示如何帮助在计算机上降低安全设置或关闭安全功能的信息。
您可以通过这些更改来解决特定的问题。
在进行这些更改之前,我们建议您对在您的特定环境中实施此替代方法可能引起的相关联的风险进行评估。
如果实施该替代方法,请采取任何适当的附加步骤来帮助保护您的系统。
本页
概要
您可能需要从 Web 页中调用一个 Windows 用户控件。若要调用一个 Windows 控件,用户控件的可访问受保护的资源和作为具有强名称程序集生成时的您必须标记 AllowPartiallyTrusted 程序集属性与 Windows 用户控件的程序集。您还必须包括在调用 Assert 方法来允许 Windows 用户控件访问 受保护的资源。
简介
本分步指南介绍了如何从 Web 页调用的 Windows 用户控件。本文介绍 Windows 用户控件才生成具有强名称的程序集。这篇文章中的示例介绍如何使用AllowPartiallyTrustedCallers属性的程序集,以便可以从 Web 页访问具有强名称的程序集。文章中的示例还介绍了如何使用Assert方法。
此用户控件演示如何使用AllowPartiallyTrustedCallers属性的程序集。除非该程序集使用的AllowPartiallyTrustedCallers属性,则仅可以由完全受信任的调用方调用具有强名称的程序集。该用户控件的示例还演示如何使用Assert方法。Assert方法声明则调用代码可以使用调用Assert方法来访问受权限请求的资源的代码。代码可以访问的资源,即使堆栈中较高位置的调用方不具有被授予访问资源的权限。
此用户控件,您可以通过使用打开对话框中选择一个文件。该控件然后在列表框中打开文本文件。此用户控件的用户界面包括一个文本框和一个列表框。文本框中显示选中,则该文件的名称,列表框中显示所选文件的内容。
若要从OpenFileDialog框中,读取所选文件的名称并读取该文件,则必须授予限制权限类型。该用户控件必须通过其代码组授予此权限。调用该控件的网页不具有此权限。
若要执行堆栈审核,因为调用方不具有所需的限制权限类型不成功,请使用Assert方法。请注意,是否不正确的或不恰当地使用Assert方法Assert方法可以打开安全漏洞。因此,您必须非常小心地使用Assert方法。反断言方法必须遵循Assert方法,只要在文件操作完成。
注意若要确保该文件的内容正确显示在列表框中,使用此用户控件选择仅文本文件。
代码组确定程序集是否符合管理员定义的标准,被称为成员条件。如果该程序集匹配,该代码组授予该程序集已与该代码组关联的一组权限。
若要创建一个代码组:
创建具有强名称的密钥对
具有强名称的密钥对用于用户控件具有强名称的程序集进行签名。当您创建的代码组授予权限以使用从部分受信任的代码的程序集使用强名称。- 打开 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年命令提示符窗口将出现。
在 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 提示窗口出现。 - 在命令提示符下键入以下命令,然后按 enter 键:
sn-k c:\snKey.snk
通过使用 Microsoft Visual C#.NET、 Microsoft Visual C# 2005年或更高版本中创建一个 Windows 用户控件
警告此替代方法可能会使您的计算机或网络更易于受到恶意用户或恶意软件 (如病毒) 的攻击。我们不建议采用这种解决方法,但我们会提供此信息,以便您可以自己决定是否实施此替代方法。使用此方法需要您自担风险。此用户控件演示如何使用AllowPartiallyTrustedCallers属性的程序集。除非该程序集使用的AllowPartiallyTrustedCallers属性,则仅可以由完全受信任的调用方调用具有强名称的程序集。该用户控件的示例还演示如何使用Assert方法。Assert方法声明则调用代码可以使用调用Assert方法来访问受权限请求的资源的代码。代码可以访问的资源,即使堆栈中较高位置的调用方不具有被授予访问资源的权限。
此用户控件,您可以通过使用打开对话框中选择一个文件。该控件然后在列表框中打开文本文件。此用户控件的用户界面包括一个文本框和一个列表框。文本框中显示选中,则该文件的名称,列表框中显示所选文件的内容。
若要从OpenFileDialog框中,读取所选文件的名称并读取该文件,则必须授予限制权限类型。该用户控件必须通过其代码组授予此权限。调用该控件的网页不具有此权限。
若要执行堆栈审核,因为调用方不具有所需的限制权限类型不成功,请使用Assert方法。请注意,是否不正确的或不恰当地使用Assert方法Assert方法可以打开安全漏洞。因此,您必须非常小心地使用Assert方法。反断言方法必须遵循Assert方法,只要在文件操作完成。
注意若要确保该文件的内容正确显示在列表框中,使用此用户控件选择仅文本文件。
- 启动 Microsoft Visual Studio.NET、 Microsoft Visual Studio 2005 年或更高版本的 Visual Studio。
- 在文件菜单上,指向新建,然后单击项目。此时将显示新建项目对话框。
- 在项目类型下单击Visual C# 项目
注意在 Visual Studio 中,单击C#下的项目类型 - 在模板下单击Windows 控件库
- 在名称框中,键入用户控件
- 单击确定
- 在解决方案资源管理器窗口中,用鼠标右键单击UserControl1.cs,然后单击查看代码。此时将显示 UserControl1.cs 文件。
- 用下面的代码替换现有代码:
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 } }
- 在解决方案资源管理器中,用鼠标右键单击AssemblyInfo.cs,然后单击查看代码。此时将显示 AssemblyInfo.cs 文件。
- 找到下面的代码:
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
- 找到下面的代码:
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyFile("c:\\snKey.snk")]
- 单击生成菜单中的生成解决方案
创建一个代码组来指定程序集的权限
警告此替代方法可能会使您的计算机或网络更易于受到恶意用户或恶意软件 (如病毒) 的攻击。我们不建议采用这种解决方法,但我们会提供此信息,以便您可以自己决定是否实施此替代方法。使用此方法需要您自担风险。代码组确定程序集是否符合管理员定义的标准,被称为成员条件。如果该程序集匹配,该代码组授予该程序集已与该代码组关联的一组权限。
若要创建一个代码组:
- 单击开始,指向设置,然后单击控制面板。此时将显示控制面板窗口。
- 双击管理工具。此时将显示管理工具窗口。
- 在 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 配置窗口。 - 在左窗格中,展开运行时安全策略,展开计算机,然后展开代码组
- 用鼠标右键单击all_code,然后单击新建。此时将显示创建代码组向导。
- 请确保选择创建新的代码组,在名称框中,键入MyUserControlCodeGroup ,然后单击下一步。此时将显示选择条件类型页。
- 在选择此代码组的条件类型列表中,单击强名称
- 单击导入。此时将显示导入强名称从集对话框。
- 查找在"使用 Microsoft Visual C#.NET、 Microsoft Visual C# 2005 年或更高版本中创建一个 Windows 用户控件"部分中,您创建的 UserControl.dll 文件,然后单击打开
- 单击下一步。显示分配给代码组的权限设置页面。
- 单击使用现有权限集,从列表中选择fulltrust 权限,然后单击下一步。此时将显示完成向导页。
- 单击完成以关闭创建代码组向导。
创建一个 HTML 文件来调用的用户控件
创建一个代码组来指定程序集的权限后,您必须创建一个 HTML 文件,若要从浏览器中,调用的用户控件,必须设置环境,以确保该用户控件调用的成功。- 单击开始,单击运行,键入记事本,然后单击确定
- 在记事本中,粘贴以下代码:
<OBJECT id="MyWinControl1" height="200" width="200" classid="http:UserControl.dll#UserControl.UserControl1" VIEWASTEXT> </OBJECT>
- Microsoft Internet Information Services (IIS) 的根文件夹中中,,将文件保存为 CallUserControl.htm。
- 将复制到 IIS 根文件夹"使用 Microsoft Visual C#.NET、 Microsoft Visual C# 2005 年或更高版本中创建一个 Windows 用户控件"一节中创建的 UserControl.dll 文件。
- 打开 Microsoft Internet Explorer。
- 在地址框中,键入http://localhost/CallUserControl.htm,然后再按 ENTER。此时将显示打开对话框。
- 查找任何文本的文件,然后单击打开。文件的文本将显示在浏览器上的列表框控件中。