我有IIS託管的Web應用程序。它使用表單身份驗證和匿名身份驗證進行配置,並且啓用了模擬。 應用程序池帳戶是網絡服務。匿名賬戶是Costa。 Costa正在訪問數據庫。 NetworkService無法訪問數據庫。WindowsIdentity.Impersonate()混淆
的問題是,請求線程(父線程)可以訪問數據庫,但子線程不能。
爲了解決這個問題。我將主線程的窗口標識對象發送給子線程,然後我調用Impersonate()。冒充的意思是「指定當前線程Windows身份驗證與模擬的帳戶 我的問題:這是一個好做法是有風險
\\Request thread code (Parent thread)
\\WindowsIdentity.GetCurrent() return Costa identity (impersonated)
requestFields.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
ThreadPool.QueueUserWorkItem(LogRequest, requestFields);
-
\\ Sub thread code that works
RequestFields requestFields = (RequestFields)obj;
HttpRequest httpRequest = requestFields.Request;
var impersonationContext = ((WindowsIdentity)requestFields.CurrentPrincipal.Identity).Impersonate();
.
.
.
impersonationContext.Undo();
你不要說你使用的是哪個版本的IIS。具有集成管道的IIS7或更高版本不再直接在配置中支持模仿,主要是因爲異步請求問題(即,當您使用asyc /等待請求可以在不再有您的模擬的不同線程上恢復時)。所以我不確定你的意思是「啓用模擬」。 – 2014-12-06 05:21:24