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

标签 c# sql-server-2008 iis impersonation

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

简短描述:

给定到 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)
  • 打开SqlConnectionWeb.config 读取连接字符串

  • 它归结为以下代码段:
    using (new Impersonator("IIS APPPOOL\\PortalAppPool", "", ""))
    {
        SqlConnection conn = new SqlConnection(databaseConnectString);
        conn.Open();
    }
    

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

    如果您有任何其他更好的想法,或者需要对此问题进行更多解释,请告诉我。

    最佳答案

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

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

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

    如果你有时间,一些简单的阅读:
  • This gives a brief overview of MSAs and Virtual Accounts
  • The differences between MSAs and Virtual Accounts
  • The dirty details on each and how to manage them

  • 为了解决您最初的问题,您可以构建一个可以执行相同逻辑的应用程序,但检查 sql 服务器是否具有正确的用户设置,而不是简单地尝试使用该帐户登录。

    关于c# - 在独立应用程序中模拟 IIS DefaultAppPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957141/

    相关文章:

    c# - C#中接口(interface)的概念

    c# - 使用自定义HttpHandler重定向Sharepoint中的用户

    sql-server-2008 - SQL Server 2008 : Is it possible to set the recovery model to simple for a single table in a database?

    c# - ASP.NET MVC4 ... "BIN"是保留关键字吗?

    asp.net - 什么时候在asp.net Web Service中调用Application_End

    php - PHP 网站的最佳 XML DB?

    c# - Asp.net core 2 - 不记名 token 的 401 错误

    c# - Windows Phone 8 - 2 背景音频冲突并且两个应用程序都终止

    c# - 来自数据库的通知而不是轮询。是否可以?

    sql-server-2008 - Excel 电子表格中的 VARCHAR 大小限制