我有一個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?
是否有可能使用當前用戶的令牌並在後臺線程上模擬該用戶?如果是的話,這怎麼可能完成,並且是否有任何用戶訪問權限需要發生?
我已經在使用模擬http請求。此代碼在後臺執行,因此它獨立於asp.net模擬。第二種選擇是我目前擁有的,並且看起來是我將堅持的解決方案。 –
極好的選擇。它會節省你的時間。 – 2011-12-12 21:26:21