2013-04-22 21 views
6

我遇到了並行調用WCF服務的問題。我試圖使用任務並行地調用兩個服務來節省一些時間(我不試圖使這個異步),但我的任務正在作爲另一個用戶運行。這兩個服務都需要Windows身份驗證,並且這兩個調用都會失敗,因爲調用服務的用戶沒有所需的權限。如何在調用Task.WaitAll()時爲任務設置用戶標識?

調用代碼(代碼如下)位於ASP.NET MVC4的Controller Action中,運行IIS 7.5。涉及的所有應用程序池都設置爲允許ASP.NET模擬並需要Windows身份驗證(所有其他方法設置爲禁用)。

// Parallel service request to two services 
Task<object>[] tasks = new Task<object>[2]; 

// this shows my credentials, e.g. "MYDOMAIN\\MyUsername" 
var userMe = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 

tasks[0] = Task<object>.Factory.StartNew(() => 
{ 
    // this shows "IIS APPPOOL\\DefaultAppPool" 
    var user = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 

    var data = client1.MyMethod(); 
    return data; 
}); 

tasks[1] = Task<object>.Factory.StartNew(() => 
{ 
    // this shows "IIS APPPOOL\\DefaultAppPool" 
    var user = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 

    var data = client2.MyMethod(); 
    return data; 
}); 

Task.WaitAll(tasks); 

我的問題:我如何指示的任務作爲當前用戶的身份運行,而不是運行的「IIS APPPOOL \默認應用」用戶?

+0

大部分由IIS只爲特殊用戶帳戶運行服務代碼。任何理由擺脫沙箱運行它作爲另一個用戶?它不是一個文件訪問函數...... – Jasper 2013-04-22 14:29:17

+0

Jasper:我調用的服務都使用Kerberos/Windows身份驗證,並要求客戶端通過身份驗證和授權(通過AD角色)才能使用它。這就是爲什麼我必須使用正確的憑證調用它們。 – Valdemar 2013-04-22 21:13:42

回答

11

試試這個:

WindowsIdentity impersonatedUser = WindowsIdentity.GetCurrent(); 

Task<object>.Factory.StartNew(() => 
{ 
    using (WindowsImpersonationContext ctx = impersonatedUser.Impersonate()) 
    { 
     //Your code 
    } 
    return data; 
}); 
+0

這是我最終使用的解決方案。一點點的開銷,但是完成這項工作。 – Valdemar 2013-04-23 10:16:50

3

你可能要考慮是否設置<alwaysFlowImpersonationContext>是合適的:

指定Windows身份始終是通過異步點流動,無論怎麼進行模擬。

默認情況下,此設置在ASP.Net內是關閉的,因此任務(可能在其他線程上運行)最終只會在沒有模擬的情況下運行。

否則(如果它是不恰當的設置),我覺得可以捕獲WindowsIdentity對象成年代由Task小號捕獲一個局部變量,然後調用它Impersonate()從任務中。 (雖然我沒有試過)

+0

明天我會給alwaysFlowImpersonationPolicy一個嘗試,看起來像我正在尋找的解決方案。 – Valdemar 2013-04-22 21:14:23

+0

似乎我需要在aspnet.config文件中添加alwaysFlowImpersonationPolicy元素,該文件對整個服務器來說是全局的,所以這不是一個選項。 – Valdemar 2013-04-23 10:16:33

相關問題