0

如何在ASP.NET页面中嵌入WINFORM控件三

by 刘武 28. 九月 2009 20:38

前两篇文章讲述了如何在ASP.NET页面中嵌入WINFORM控件,并且通过第二篇我们了解到有些情况下,只有本地网络或将访问的网站添加到信任站点才可以正确的访问该控件。其实有时候会更复杂,我们还需要调整.NET程序集的权限,本篇就是一个具体的例子。该例子会通过WINFORM控件在本地磁盘中写入文件。

一 打开前两篇创建的项目,并添加WINFORM用户控件IoTest,代码如下:

namespace Liuw.Net.WindowsControlLibrary
{
    public partial class IoTest : UserControl
    {
        public IoTest()
        {
            InitializeComponent();
        }

        public void Write(string path)
        {
            File.WriteAllText(path, "welcome to www.liuwu.net ");
        }
    }
}

功能很简单,仅提供一个公共的Write方法,向指定的文件写入信息。

二 编译该项目,并将Liuw.Net.WindowsControlLibrary.dll拷贝到WebSite所在目录

三 添加IoTest.aspx页面,并添加以下代码


<script type="text/javascript">
    function Write()
    {
        var obj = document.getElementById('ctl');
        obj.Write("D:/Test.txt");
    }
</script>
<input type="button" value="Write" onclick="Write()" />
<object id="ctl"  classid="Liuw.Net.WindowsControlLibrary.dll#Liuw.Net.WindowsControlLibrary.IoTest"></object>
可以看出我们是在D盘写入Test.txt文件。

 四 访问该页面,我们会得到脚本错误

请求“System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”类型的权限已失败。

其实不用紧张,这说明该网站没有执行指定程序集的权限,那该如何做呢,下面就来配置相关权限。

五 打开“管理工具”/ “Microsoft .NET Framework 2.0 配置”

六 展开“运行库安全策略”,并点击右边的“调整区域安全性” 

七 选择下一步,并将 "本地Intranet "设为完全信任

 

因笔者测试的地址用的是localhost,如果你已将网站添加的信任网站,则调整信任网站为完全信任。

八 重新启动IE,就可以了。

注意:该配置工具只有装了SDK以后才会有,所以为了有更强的操作性,我们必须寻找其他设置权限的途径,以后的章节会针对该问题进行讨论。

前篇:

如何在ASP.NET页面中嵌入WINFORM控件一

如何在ASP.NET页面中嵌入WINFORM控件二

Tags: ,

技术生涯

2

如何在ASP.NET页面中嵌入WINFORM控件二

by 刘武 23. 九月 2009 20:46

上一篇介绍了在ASP.NET页面中嵌入WINFORM控件的基本方法,本篇会举个稍微复杂的例子来说明如何在页面中调用WINFORM控件的属性和方法。

一 新建项目 Liuw.Net.WindowsControlLibrary,并添加WINDOWS用户控件 MyControl1

二 给控件 MyControl1 添加属性和方法:

namespace Liuw.Net.WindowsControlLibrary
{
    public partial class MyControl1 : UserControl
    {
        public MyControl1()
        {
            InitializeComponent();
        }

        private string _userName = "";
        public string UserName
        {
            set { _userName = value; }
            get { return _userName; }
        }

        public void SayHello()
        {
            MessageBox.Show("Welcome To Liuwu.net," + _userName);
        }
    }
}

该控件包含一个UserName属性及SayHello方法,当调用方法的时候,则弹出对话框。

三 编译项目,并拷贝dll文件到网站目录

四 添加页面SayHello.aspx


<script type="text/javascript">
function SayHello()
{
    var obj = document.getElementById("ctl");
    var input = document.getElementById("inputName");
    obj.UserName = input.value;
    obj.SayHello();      
}
</script>
Name:<input type="text" id="inputName" />
<input type="button" value="SayHello" onclick="SayHello()" />
<object id="ctl" 
 classid="Liuw.Net.WindowsControlLibrary.dll#
 Liuw.Net.WindowsControlLibrary.MyControl1"
></object>

不难看出,用JS脚本就可以完成属性和方法的调用,不过此时运行页面,可能会出现脚本错误,提示 “对象不支持该属性或方法”。那是因为我们在编译用户控件时少了一个步骤:

五 右击项目Liuw.Net.WindowsControlLibrary,并选择属性,选择“应用程序”选项卡,点击"程序集信息",勾中“使程序集COM可见”,

重新编译,并替换网站目录下的文件:

现在我们就可以正常访问了,但是还有个限制,只有本地网络或将访问的网站添加到信任站点才可以。是不是很麻烦,的确,他就是这麽麻烦,甚至笔者在VS2005环境下直接浏览也会提示脚本错误,必须建立虚拟目录,或者发布后才能使用。还有个方法就是配置.NET的程序集权限,这个会在以后的章节单独讨论。

前篇:

如何在ASP.NET页面中嵌入WINFORM控件一

后篇:

如何在ASP.NET页面中嵌入WINFORM控件三  

Tags: ,

技术生涯

11

如何在ASP.NET页面中嵌入WINFORM控件一

by 刘武 21. 九月 2009 20:45

在.NET之前,我们如果想访问客户端的资源,最常见的方式就是在网页里面嵌入ACTIVEX控件。现在有了.NET,我们可以将WINFORM控件嵌入在网页里面,从而直接控制客户端,不过前提是客户端必须安装了.NET库。这有点像JAVA 的APPLET(笔者对JAVA不是很熟,如有问题欢迎指正)。由于需要.NET的运行库,所以使用起来有很多限制,不过如果是企业内部系统,.NET库可以做为客户端部署的一部分,这样可以利用.NET编程的优势,大大简化开发过程。

本文就从最简单的例子入手,讲解具体的开发过程。

一 新建windows控件库项目,姑且取名为Liuw.Net.WindowsControlLibrary

二 添加windows控件HelloWorld

三 添加按钮及事件

        这里我们只添加一个按钮,点击按钮就弹出提示框 "Welcome To Liuwu.net "

      以下是部分代码

namespace Liuw.Net.WindowsControlLibrary
{
    public partial class HelloWorld : UserControl
    {
        public HelloWorld()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Welcome to Liuwu.Net");
        }
    }
}

四 编译该项目,得到Dll文件 Liuw.Net.WindowsControlLibrary.dll

五 新建网站,将刚才的Dll文件拷贝到根目录下,并添加页面 WinformCtlTest.aspx

六 在aspx页面添加以下代码

<object id="ctl" classid="Liuw.Net.WindowsControlLibrary.dll#

Liuw.Net.WindowsControlLibrary.HelloWorld"></object>

这里有点像ActiveX控件的调用,classid的命名规则是 "dll文件名#命名空间名.类名",中间并没有换行,我这里只是为了方便显示。

七 运行该页面,就会看到刚才编写的控件了,点击按钮,则弹出提示框 "Welcome To Liuwu.net "

怎么样,是不是觉得太简单了,别急,下一篇会举个稍微复杂的例子。

后篇:

如何在ASP.NET页面中嵌入WINFORM控件二

如何在ASP.NET页面中嵌入WINFORM控件三  

Tags: ,

技术生涯

0

加密web.config文件二

by 刘武 16. 九月 2009 21:07

上一篇文章介绍了用 DataProtectionConfigurationProvider加密web.config文件的方法

不过他有一个缺陷,加密的文件只有在本机才能解密,如果有多台服务器的话,则需要每台机单独加密,因此不利于部署。

而利用RSAProtectedConfigurationProvider来加密就恰好可以解决这个问题。

本文就介绍一下如何利用RSAProtectedConfigurationProvider来部署多台服务器。

一 创建RSA 密钥

运行命令:aspnet_regiis -pc "LiuwuNetKeys" -exp

二 建立虚拟目录名称为EncryptWebConfig并添加Web.config文件如下:


<configProtectedData>
  <providers>
    <add
        keyContainerName="LiuwuNetKeys"
        useMachineContainer="true"
        description="Liuwu.net Keys"
        name="LiuwuNetProvider"
        type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</configProtectedData>
 
<connectionStrings>
  <add name="Conn" connectionString="Data Source=liuwu;User ID=liuwu;Password=liuwu;" />
</connectionStrings>
主要是在config文件中加入configProtectedData配置节。

三 加密

运行命令aspnet_regiis -pe "connectionStrings" -app "/EncryptWebConfig" -prov "LiuwuNetProvider"

其中/EncryptWebConfig是虚拟目录的名称,LiuwuNetProvider 是上一步ConfigProtectedData配置节中配置的名称

加密后的连接字符串如下:


<connectionStrings configProtectionProvider="LiuwuNetProvider">
 <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
    xmlns="http://www.w3.org/2001/04/xmlenc#">
    <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
      <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
        <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <KeyName>Rsa Key</KeyName>
        </KeyInfo>
        <CipherData>
          <CipherValue>RoOicEmyEeyGt216zRdwRXVaBWB2rRn+znQN59Y9/U55dEWtYdY3/HnVzIzS/BTeJ6JMOkXWLXFSjSNrA8LY22ya65r8FBI8byOCEFJ5nd1sIpnCA4Fhm72JEKhojGXo1kMURCfSQd8BdHCAJskMrsG3/bGJconC8TyyfEXTgcM=</CipherValue>
        </CipherData>
      </EncryptedKey>
    </KeyInfo>
    <CipherData>
      <CipherValue>JTALo/rdj0zMzN2i0oFwP3wD6jQXijxpUjOc/5bBpOvP+dPQ2+rRDQXN5h+kzUWkB1vO4WSG9dDXif8Keud2QAJPU4eh4oc6pZ35sR6Ks/WzMqhnqPJi4GZ3yjodD+tuhgY2Cu94Q60R+IY4/DZ2iqrj4rNi51UCaFa7iF/CpOp6dMDkEu8ema0Asvfomj6R</CipherValue>
    </CipherData>
  </EncryptedData>
</connectionStrings>

四 分配权限

此时运行程序,可能会出现以下错误:

分析器错误消息: 未能使用提供程序“LiuwuNetProvider”进行解密。提供程序返回错误消息为: 打不开 RSA 密钥容器。

这是因为web服务器的运行帐号没有足够的权限来访问RSA容器,因此我们需要给他分配权限,在win2003的系统中,web服务器的运行帐号是NT Authority\Network Service

运行命令:aspnet_regiis -pa "LiuwuNetKeys" "NT Authority\Network Service"

LiuwuNetKeys就是第一步创建的密钥名称

到现在程序可以正常运行了。

五 导出密钥

运行命令:aspnet_regiis -px "LiuwuNetKeys" "d:\LiuwuNetKeys.xml" -pri 

LiuwuNetKeys 是第一步创建的密钥名称,这里将它导出为D盘的LiuwuNetKeys.xml文件

自此本机的操作已经完成,如果要解密,可以运行 aspnet_regiis -pd "connectionStrings" -app "/EncryptWebConfig" 

六 部署到其他机器

在其他机器只要将加密后的Web.config文件拷贝过来,然后运行 aspnet_regiis -pi "LiuwuNetKeys" "d:\LiuwuNetKeys.xml" 就可以了,同样要记得分配权限。

注:这里只用了虚拟目录,其实也可以使用物理路径,具体参数可以在命令行运行 aspnet_regiis 查看具体的帮助。

 

Tags:

技术生涯

0

加密web.config文件一

by 刘武 14. 九月 2009 20:51

web.config 文件中经常会包含一些敏感信息,最常见的就是数据库连接字符串了,为了防止该信息泄漏,最好是将相关内容加密。

Aspnet_regiis.exe命令已经提供了加密配置文件的方法,系统默认提供两种加密方式:

  1. DataProtectionConfigurationProvider
  2. RSAProtectedConfigurationProvider

当然,如果有兴趣也可以编写自己的加密提供程序。

 

本文主要讲解如何利用DataProtectionConfigurationProvider来完成web.config的加解密

一 建立虚拟目录  http://localhost/EncryptWebConfig,并添加web.config,其中包含数据库连接字符串:

    <connectionStrings>
            <add name="Conn" connectionString="Data Source=liuwu;User ID=liuwu;Password=liuwu;"/>
    </connectionStrings>

二  运行 aspnet_regiis -pe "connectionStrings" -app "/EncryptWebConfig" -prov "DataProtectionConfigurationProvider"

  • aspnet_regiis 位于%WinDir%\Microsoft.NET\Framework\<versionNumber>目录下。
  • -pe 指定要加密的配置节,这里是 connectionStrings 。
  • -app 指定该配置文件所在的虚拟目录,这里是EncryptWebConfig。
  • -prov 指定要使用的提供程序,这里使用的是DataProtectionConfigurationProvider。

三  加密后连接字符串已经不可见了,可以看到如下形式的配置节

   <connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
       <EncryptedData>
         <CipherData>
           <CipherValue>AQAAANCMnd8BFdERjHoAw=</CipherValue>
         </CipherData>
       </EncryptedData>
    </connectionStrings>

四 如果要解密,则运行以下命令 aspnet_regiis -pd "connectionStrings" -app "/EncryptWebConfig"

  • -pd 指定要解密的配置节
  • -app 指定虚拟目录

五 如果不想建立虚拟目录,也可以指定配置文件的物理路径:aspnet_regiis.exe -pef "connectionStrings" d:\EncryptWebConfig -prov "DataProtectionConfigurationProvider"

  • -pef 指定要加密的配置节及配置文件的物理路径

六 解密使用 aspnet_regiis -pdf "connectionStrings" d:\EncryptWebConfig

  • -pdf 指定要解密的配置节及配置文件的物理路径

有关利用RSA加密的内容可以参考 加密web.config文件二

 

Tags:

技术生涯

Powered by BlogEngine.NET 1.6.1.9  登录
Original Design by Laptop Geek, Adapted by onesoft