如何使用 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. 查找任何文本的文件,然后单击打开文件的文本将显示在浏览器上的列表框控件中。
目录
相关文章
|
1月前
|
缓存 关系型数据库 API
后端开发:构建高效、可扩展的Web应用程序的关键
后端开发:构建高效、可扩展的Web应用程序的关键
22 0
|
8天前
|
安全 编译器 PHP
PHP 8.1版本发布:引领Web开发新潮流
PHP编程语言一直是Web开发的主力军,而最新发布的PHP 8.1版本则为开发者们带来了更多创新和便利。本文将介绍PHP 8.1版本的主要特性,包括更快的性能、新的语言功能和增强的安全性,以及如何利用这些功能来提升Web应用程序的质量和效率。
|
9天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
17 0
|
28天前
|
前端开发 JavaScript 数据管理
描述一个使用Python开发Web应用程序的实际项目经验,包括所使用的框架和技术栈。
使用Flask开发Web应用,结合SQLite、Flask-SQLAlchemy进行数据管理,HTML/CSS/JS(Bootstrap和jQuery)构建前端。通过Flask路由处理用户请求,模块化代码提高可维护性。unittest进行测试,开发阶段用内置服务器,生产环境可选WSGI服务器或容器化部署。实现了用户注册登录和数据管理功能,展示Python Web开发的灵活性和效率。
15 4
|
1月前
|
SQL 安全 测试技术
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
15 0
|
1月前
|
存储 安全 数据安全/隐私保护
什么是 Web 应用程序的会话管理?如何在 Python 中实现?
什么是 Web 应用程序的会话管理?如何在 Python 中实现?
12 2
|
1月前
|
存储 设计模式 前端开发
请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
【2月更文挑战第26天】【2月更文挑战第89篇】请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
|
1月前
|
Web App开发 前端开发 测试技术
Web应用程序测试工具Selenium用法详解
Web应用程序测试工具Selenium用法详解
37 0
|
1月前
|
Windows
Windows Server 各版本搭建 Web 服务器实现访问本地 Web 网站(03~19)
Windows Server 各版本搭建 Web 服务器实现访问本地 Web 网站(03~19)
57 2
|
1月前
|
存储 PHP 数据库
使用Net2FTP轻松打造免费的Web文件管理器并公网远程访问
使用Net2FTP轻松打造免费的Web文件管理器并公网远程访问