我的問題的描述聽起來有點複雜,是什麼讓我覺得我的方法有缺陷,所以我也會欣賞任何更好的想法。在獨立應用程序中模擬IIS DefaultAppPool
簡短說明:
由於連接字符串MSSQL 2008數據庫和網站名稱部署在IIS6,我希望通過編程驗證網站是否能夠連接到數據庫。
長描述:
- 我有MSSQL Server數據庫,姑且稱之爲
portal_db
。 - 我有一個應用程序部署在IIS6上,名爲
portal
。我可以通過urlhttp://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
- 特定的用戶,本地系統等等。當我將傳遞給我的用戶名和密碼的憑證更改爲我的用戶名和密碼時,我得到了期望的結果(當我在數據庫中沒有登錄映射時,例外,並且當我添加一個時,一切正常)。但我似乎無法模擬IIS APPPOOLS\PortalAppPool
虛擬帳戶 - 只是不知道應傳遞給LogonUser
的參數 - 如果連這個都不可能,我也不會感到驚訝。也許我專注於模擬方法太多(我正在使用它來訪問其他用戶的註冊表項和服務,並且效果很好),也許還有更好的方法。
如果您有任何其他更好的想法或需要對此問題進行更多解釋,請讓我知道。