在独立应用程序中模拟IIS DefaultAppPool

时间:2012-10-18 14:35:59

标签: c# sql-server-2008 iis impersonation

我的问题描述听起来有些复杂,是什么让我觉得我的方法有缺陷,所以我也会欣赏任何更好的主意。

简短说明:

给定了在IIS6上部署的MSSQL 2008数据库和网站名称的连接字符串,我想以编程方式验证网站是否能够连接到数据库。

详细说明:

  1. 我有MSSQL Server数据库,我们称之为portal_db
  2. 我在IIS6上部署了一个名为portal的应用程序。我可以通过网址http://localhost/portal访问它。在Web.config文件中,我为数据库指定了连接字符串,如下所示:"server=(local)\SQLEXPRESS;trusted_connection=yes;database=portal_db"
  3. Web应用程序正在使用System.Data.SqlClient.SqlConnection访问数据库,没有任何包装器,ORM,映射,任何东西。
  4. 网站配置为在appool PortalAppPool中运行。它使用ApplicationPoolIdentity作为安全上下文。
  5. 无法轻松修改Web应用程序代码(尤其是访问数据库的方式)
  6. 当我的Web应用程序尝试连接到数据库时,它会成功还是失败,具体取决于是否在MSSQL数据库中配置了用户IIS APPPOOL\PortalAppPool。这是我理解的一部分,但在部署我的应用程序时,我经常忘记在db for apppool虚拟帐户中创建新的用户/登录。所以我想要做的是从独立的独立控制台应用程序(最好用C#编写,但不一定用)来验证,我的Web应用程序是否可以通过以下方式访问数据库:

    1. Web.config
    2. 读取连接字符串
    3. 读取应用程序池标识设置(由目录服务API设法执行此操作)
    4. 使用在应用池上定义的凭据模拟身份(使用我在此处找到的模拟类:http://platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials/,它使用在许多其他地方找到的提示,包括MSDN)
    5. SqlConnection
    6. 读取连接字符串,打开Web.config

      归结为以下代码段:

      using (new Impersonator("IIS APPPOOL\\PortalAppPool", "", ""))
      {
          SqlConnection conn = new SqlConnection(databaseConnectString);
          conn.Open();
      }
      

      当我的应用程序池安全上下文设置为除AppPoolIdentity之外的任何其他值 - 特定用户,本地系统等时,一切都运行良好。当我将传递给Impersonator的凭据更改为我的用户名时和密码,我得到了理想的结果(当我在数据库中没有登录映射时出现异常,当我添加一个时,一切正常)。但我似乎无法模仿IIS APPPOOLS\PortalAppPool虚拟帐户 - 只是不知道应该将哪些参数传递给LogonUser - 如果不可能,我也不会感到惊讶。也许我过于专注于模仿方法(我使用它来访问其他用户的注册表项和服务,并且效果很好),也许有更好的方法。

      如果您有任何其他更好的想法或需要更多解释此问题,请告知我们。

1 个答案:

答案 0 :(得分:0)

我认为您不能冒充虚拟帐户(IIS服务帐户)。它们是主要用于IIS安全性的特殊服务帐户。它们仅用于本地服务,不能附加到任何域。 Windows Server 2008 R2和Windows 7中的虚拟帐户是“托管本地帐户”,提供以下功能以简化服务管理:

  • 无需密码管理。
  • 在域环境中使用计算机标识访问网络的能力。

您无法“登录”虚拟帐户,Windows出于安全目的使用它们:

如果你有时间,可以阅读一些内容:

要解决原始问题,您可以构建一个可以执行相同逻辑的应用程序,但检查sql server是否具有正确的用户设置,而不是仅仅尝试使用该帐户登录。

相关问题