2012-02-04 18 views
1

我们如何访问COM对象中的web.config连接字符串?我无法获得web.config文件的句柄。请帮助通过COM对象从web.config中获取加密连接字符串到经典asp中

我有一个经典的asp应用程序需要加密connectionString到数据库。该网站当前有一个database.asp文件,包含在所有页面中以获取连接。安全团队要求我们删除明文用户名,密码和服务器名称。我试图创建一个COM对象来从应用程序的根与加密cionnectionstring web.config文件的等待状态,然后传回一个CONNSTRING作为变量

Set cn = Server.CreateObject("ADODB.Connection") 
cn.CursorLocation = 3 
set cnStringReader = Server.CreateObject("PropertyReader.FetchProperty") 
cnString = cnStringReader.getProperty(); 
cn.ConnectionString(cnString) 

使用,但COM对象犯规找到web.config文件。我已将COM对象保存在Web应用程序目录的bin目录中。并使用gacutil进行注册。

请大家帮忙。

+0

传统的ASP,全局设置在global.asa文件。 web.config来自哪里? – 2012-02-04 00:13:56

+0

好吧,我们在web应用中有一个aspx文件 - 所以应用程序不是纯粹的asp。但所有其他文件都是asp并包含db.asp。所以我们可以访问.NET功能,但不可能将整个应用程序转换为.NET - 不知道为什么这样做。 :) – user1188675 2012-02-04 00:17:35

+0

它找到该文件有什么作用?你可以在ASP中使用'Server.MapPath'找到文件的物理路径。 – 2012-02-04 01:08:35

回答

1

当ASP CreateObject构造COM组件时,它无法将Web应用程序上下文与底层.NET组件进行通信。该组件被加载到一个标准的默认AppDomain中,就像您在.vbs文件中使用了CreateObject一样,并使用脚本shell来执行它。

因此,标准的.NET OpenWebConfiguration没有网站上下文,从中可以确定“/”代表的物理路径,因此可以加载什么web.config文件。

如果您可以解析站点名称(如所见的IIS管理器),那么您可以使用另一个过载OpenWebConfiguration,它将站点名称作为第二个参数。

是否可以用这种方式读取加密连接字符串可能是另一回事,我会怀疑它。我从来没有尝试过,但如果可以的话,我会质疑首先将它们加密的价值。配置部分加密的方法将暗示只有注册了加密的应用才能解密。你的COM组件不属于这个应用程序。

就个人而言,如果你必须遵守“安全团队”的棺材,你可能会问他们如何去做的建议。我的方法是使用SSPI集成安全性,因此不需要以任何形式存储任何用户名/密码对。

+0

我这样做,(使用OpenMappedWebConfiguration而不是OpenWebConfiguration),我只需要确定用户运行的ASP进程,然后给它权限到.NET配置项:aspnet_regiis -pa“NetFrameworkConfigurationKey”“NT AUTHORITY \ IUSR” – 2014-11-25 01:57:17

0

从ASP Classic开始,您必须像普通XML文件(即使用XmlDocument)一样阅读web.config。这需要web.config文件的完整路径,您可以从Request.ServerVariables("APPL_PHYSICAL_PATH") +“web.config”中获取该路径。

请注意,由于您像正常的XML文件一样正在读取web.config,因此WebConfigurationManager中的加密实用程序不起作用。你将不得不推出自己的加密。

请小心调用ASP Classic中包装在COM包装中的.NET对象。它可能会变得怪异。

http://connect.microsoft.com/VisualStudio/feedback/details/294241/kb937143-breaks-asp-to-net-com-interop

http://support.microsoft.com/kb/945701

+0

您仍然可以使用WebConfigurationManager使用WebConfigurationManager.OpenMappedWebConfiguration。创建一个包装它的C#COM DLL,然后创建一个COM DLL来调用C#COM DLL。荒谬的,但为我工作。请注意,您必须传入网站根,因为。我通过My​​VB6ComComponent.SetWebPagesPath(Request.ServerVariables(“APPL_PHYSICAL_PATH”))从ASP执行此操作,然后运行MyVB6ComComponent.MyConnectionString。 – 2014-11-25 01:55:55