2008-09-25 73 views
3

我的DBA要求通過受信任的域帳戶完成所有數據庫訪問。這可以通過設置web.config來完成。這要求用戶登錄或在域上爲IE傳遞憑證。我想通過使用代碼來模擬用戶。我使用這個知識庫文章中找到的代碼:在Asp.Net中模擬用戶

http://support.microsoft.com/kb/306158

它的偉大工程,我傳遞的憑據,模仿用戶,然後撥打電話到數據庫並返回數據。

問題是如果我去另一個頁面,我失去了我的模擬憑據。這意味着每次我調用數據庫時都必須運行模擬代碼。

如果IIS可以模擬所有頁面的域用戶,那麼爲什麼我在使用代碼時不能模擬用戶?

它似乎是與線程上下文切換的東西。我曾嘗試在Aspnet.config文件中設置alwaysFlowImpersonatingPolicy,但它不起作用。

http://msdn.microsoft.com/en-us/library/ms229553.aspx

什麼建議嗎?是否有可能做我想做的事?

+0

「問題是如果我去另一個頁面」..這意味着它是一個新的頁面請求。 iis可能會使用不同的線程從池中執行新的頁面,並且它不會有任何舊的上下文信息.. – 2008-09-25 00:10:07

回答

1

您失去模擬上下文的原因是因爲每當新的頁面請求結束時,模擬上下文將超出範圍。

根據文檔<alwaysFlowImpersonationPolicy>用於確保跨異步調用維護相同的模擬上下文。例如,在對遠程Web服務進行異步調用時,回調模擬上下文與啓動線程相同。對於ASP.NET,模擬上下文只會在頁面請求的生命週期中流動。

3

模擬發生在線程級別。模仿會導致通常從進程繼承的線程的訪問令牌被替換爲另一個。最好的做法是在您完成所需操作時儘快恢復模擬效果,從而恢復令牌。這個故事與IIS或ASP.NET沒有什麼不同。每個請求通常由不同的線程處理,因此您必須使每個線程模擬用戶。

這意味着每次我做出 調用數據庫我需要運行 冒充代碼的時間。

所以這是正確的。

如果IIS可以模擬域用戶 的所有網頁,那麼爲什麼我不能 同時使用代碼模擬用戶?

IIS不會做任何不同的事情,所以它可能只是一種可以感知的錯覺。除非所有頁面都由同一個線程提供服務,並且模擬的令牌從未在每個頁面被提供時恢復,否則它不能模擬所有頁面的用戶。

它似乎是線程 上下文切換的東西。

不是。除非你正在做異步處理(你沒有說你在你的問題中做過),否則模擬上下文的流程將不相關。如果您在處理單個請求期間直接或間接導致線程切換,則只需擔心流動模擬上下文。如果您希望次要(工作)線程完成的工作繼續在主要線程的模擬環境下發生,則需要確保輔助線程借用模擬令牌。在.NET Framework 1.1中,您必須非常小心並手動編排模擬上下文的流程。然而,對於.NET 2.0,引入了ExecutionContext API,並且執行了許多重大舉措。