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

简介: 原文 http://support.microsoft.com/kb/839300/zh-cn 重要本文向您显示如何帮助在计算机上降低安全设置或关闭安全功能的信息。您可以通过这些更改来解决特定的问题。

原文 http://support.microsoft.com/kb/839300/zh-cn

重要 本文向您显示如何帮助在计算机上降低安全设置或关闭安全功能的信息。 您可以通过这些更改来解决特定的问题。 在进行这些更改之前,我们建议您对在您的特定环境中实施此替代方法可能引起的相关联的风险进行评估。 如果实施该替代方法,请采取任何适当的附加步骤来帮助保护您的系统。
展开全部 | 关闭全部

本页

概要

您可能需要从 Web 页中调用一个 Windows 用户控件。若要调用一个 Windows 控件,用户控件的可访问受保护的资源和作为具有强名称程序集生成时的您必须标记 AllowPartiallyTrusted 程序集属性与 Windows 用户控件的程序集。您还必须包括在调用 Assert 方法来允许 Windows 用户控件访问 受保护的资源。

简介

本分步指南介绍了如何从 Web 页调用的 Windows 用户控件。本文介绍 Windows 用户控件才生成具有强名称的程序集。这篇文章中的示例介绍如何使用AllowPartiallyTrustedCallers属性的程序集,以便可以从 Web 页访问具有强名称的程序集。文章中的示例还介绍了如何使用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年命令提示符窗口将出现。

    在 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框中,读取所选文件的名称并读取该文件,则必须授予限制权限类型。该用户控件必须通过其代码组授予此权限。调用该控件的网页不具有此权限。

若要执行堆栈审核,因为调用方不具有所需的限制权限类型不成功,请使用Assert方法。请注意,是否不正确的或不恰当地使用Assert方法Assert方法可以打开安全漏洞。因此,您必须非常小心地使用Assert方法。反断言方法必须遵循Assert方法,只要在文件操作完成。

注意若要确保该文件的内容正确显示在列表框中,使用此用户控件选择仅文本文件。
  1. 启动 Microsoft Visual Studio.NET、 Microsoft Visual Studio 2005 年或更高版本的 Visual Studio。
  2. 文件菜单上,指向新建,然后单击项目此时将显示新建项目对话框。
  3. 项目类型下单击Visual C# 项目

    注意在 Visual Studio 中,单击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. 单击使用现有权限集,从列表中选择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. 查找任何文本的文件,然后单击打开文件的文本将显示在浏览器上的列表框控件中。
目录
相关文章
|
16天前
|
开发框架 前端开发 JavaScript
ASP.NET Web Pages - 教程
ASP.NET Web Pages 是一种用于创建动态网页的开发模式,采用HTML、CSS、JavaScript 和服务器脚本。本教程聚焦于Web Pages,介绍如何使用Razor语法结合服务器端代码与前端技术,以及利用WebMatrix工具进行开发。适合初学者入门ASP.NET。
|
3天前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
22 5
|
11天前
|
数据挖掘 BI
.net8 Syncfusion生成pdf/doc/xls/ppt最新版本
通过使用 Syncfusion,您可以高效地生成各种文档,满足不同的业务需求。这些工具不仅易于使用,还具有高性能和高度可扩展性,是处理文档的理想选择。
36 16
|
11天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
57 13
|
16天前
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
1月前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
1月前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
20天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
20天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。