Ho un progetto asp.net in cui la richiesta delegherà il lavoro in background (tramite quartz.net). L'applicazione Web utilizza l'autenticazione e la rappresentazione di Windows.Windows Rappresentazione e duplicazione dei token
Vorrei anche impersonare l'utente corrente sul thread in background. Ho letto come impersonare un utente con un nome di dominio, nome utente e password forniti e chiamando il kernel. Quel metodo funziona.
IntPtr token;
var successfullLogon = LogonUser(userName, password, domain, logonType, logonProvider, out token);
if(successfullLogon == false)
{
var errorCode = Marshal.GetHRForLastWin32Error();
Marshal.ThrowExceptionForHR(errorCode);
}
che funziona, ma mi obbliga a presentare una specifica nome utente/password, o hanno l'utente immettere la propria password. nessuna situazione è l'ideale.
Quello che mi piacerebbe è passare il token dall'identità dell'utente dalla richiesta allo sfondo e quindi impersonare l'utente da questo token esistente. Ho letto che dovrei essere in grado di chiamare 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);
}
}
Ma ottengo un'eccezione operazione sovrapposta di I/O è nel corso
Le chiamate NativeMethod provengono da questo post: How do I pass credentials to a machine so I can use Microsoft.Win32.RegistryKey.OpenRemoteBaseKey() on it?
È possibile utilizzare il token dell'utente corrente e impersonare quell'utente su un thread in background? In tal caso, come si può fare e ci sono diritti di accesso utente necessari per questo?
Sto già utilizzando la rappresentazione per le richieste http. questo codice viene eseguito in background, quindi è indipendente dalla rappresentazione di asp.net. la seconda opzione è ciò che attualmente ho in atto e sembra essere la soluzione con cui mi attaccherò. –
Scelta eccellente. Ti farà risparmiare tempo. –