2011-12-12 62 views
5

我有一個asp.net項目,請求將工作委託給後臺(通過quartz.net)。該Web應用程序正在使用Windows身份驗證和模擬。Windows模擬和複製令牌

我也想在後臺線程上模擬當前用戶。我已閱讀了如何使用提供的域名,用戶名和密碼來模擬用戶並調出內核。該方法有效。

IntPtr token; 
var successfullLogon = LogonUser(userName, password, domain, logonType, logonProvider, out token); 
if(successfullLogon == false) 
{ 
    var errorCode = Marshal.GetHRForLastWin32Error(); 
    Marshal.ThrowExceptionForHR(errorCode); 
} 

這可行,但它需要我提供一個特定的用戶名/密碼,或讓用戶輸入他們的密碼。這兩種情況都不理想。

我想將令牌從請求中的用戶身份傳遞給後臺,然後從此已有令牌中冒充用戶。我讀,我應該能夠調用DuplicateHandle,

var token = ((WindowsIdentity)Request.User.Identity).GetToken().ToInt64(); 
var token = new IntPrt(token from request); 
IntPtr duplicate; 
try 
{ 
    if(NaviteMethod.DuplicateToken(token, SecurityImpersonationLevel.Impersonate, out duplicate) == false) 
    { 
     var errorCode = Marshal.GetHRForLastWin32Error(); 
     Marshal.ThrowExceptionForHR(errorCode); 
    } 

    using(var identity = new WindowsIdentity(duplicate)) 
    using(var context = identity.Impersonate()) 
    { 
     //do work 
     context.Undo(); 
    } 
} 
finally 
{ 
    if(duplicate != IntPtr.Zero) 
    { 
     NaviteMethod.CloseHandler(duplicate); 
    } 
} 

但我得到一個異常重疊I/O操作正在進行

的NativeMethod調用來自這篇文章:How do I pass credentials to a machine so I can use Microsoft.Win32.RegistryKey.OpenRemoteBaseKey() on it?

是否有可能使用當前用戶的令牌並在後臺線程上模擬該用戶?如果是的話,這怎麼可能完成,並且是否有任何用戶訪問權限需要發生?

回答

1

不幸的是,你不能繞過「LogonUser」。一種選擇是使用ASP.NET Impersonation。如果你用第一個代碼塊代替第二個代碼塊的前兩行,你已經擁有了第二個代碼塊。

+0

我已經在使用模擬http請求。此代碼在後臺執行,因此它獨立於asp.net模擬。第二種選擇是我目前擁有的,並且看起來是我將堅持的解決方案。 –

+0

極好的選擇。它會節省你的時間。 – 2011-12-12 21:26:21