我的问题的描述听起来有些复杂,是什么让我认为我的方法有缺陷,所以我也会欣赏任何更好的想法。
简短的介绍:
给定到 MSSQL 2008 DB 的连接字符串和部署在 IIS6 上的网站名称,我想以编程方式验证网站是否能够连接到数据库。
详细描述:
- 我有 MSSQL Server 数据库,我们称之为
portal_db
. - 我在 IIS6 上部署了一个应用程序,名为
portal
. 我可以通过 url 访问它http://localhost/portal
。在 Web.config 文件中,我指定了到我的数据库的连接字符串,如下所示:"server=(local)\SQLEXPRESS;trusted_connection=yes;database=portal_db"
- Web 应用程序正在使用
System.Data.SqlClient.SqlConnection
没有任何包装器、ORM、映射等任何东西来访问数据库。 - 网站配置为在 appool 中运行
PortalAppPool
。它ApplicationPoolIdentity
用作安全上下文。 - 无法轻松修改 Web 应用程序代码(尤其是它访问数据库的方式)
当我的 Web 应用程序尝试连接到数据库时,它要么成功要么失败,具体取决于用户IIS APPPOOL\PortalAppPool
是否在 MSSQL 数据库中配置。这是我理解的一部分,但是在部署我的应用程序时,我经常忘记在数据库中为 apppool 虚拟帐户创建新用户/登录名。所以我想做的是从单独的、独立的控制台应用程序(最好用 C# 编写,但不一定)验证我的 Web 应用程序是否可以访问数据库,方法如下:
- 读取连接字符串
Web.config
- 读取应用程序池标识设置(由目录服务 API 管理)
- 使用在应用程序池中定义的凭据模拟身份(使用我在此处找到的模拟类:http: //platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials/它使用在许多其他地方找到的想法, 包括 MSDN)
SqlConnection
使用读取的连接字符串打开Web.config
它归结为以下代码段:
using (new Impersonator("IIS APPPOOL\\PortalAppPool", "", ""))
{
SqlConnection conn = new SqlConnection(databaseConnectString);
conn.Open();
}
当我的应用程序池安全上下文设置为除特定用户、本地系统等之外的任何其他值时,一切都运行良好AppPoolIdentity
。当我更改传递Impersonator
给我的用户名和密码的凭据时,我得到了想要的结果(当我没有数据库中的登录映射,添加一个后一切正常)。但我似乎无法模拟IIS APPPOOLS\PortalAppPool
虚拟帐户 - 只是不知道应该传递哪些参数LogonUser
- 如果它甚至不可能,我不会感到惊讶。也许我过于关注模拟方法(我正在使用它来访问其他用户的注册表项和服务并且效果很好),也许有一些更好的方法。
如果您有任何其他更好的想法,或者需要对此问题进行更多解释,请告诉我。