Impersonate different user on current HttpContext
Visite: 6291
mercoledì 20 settembre 2006


Page not translated!
I'm sorry but the text of this page doesn't have translation at this time.

Il quesito è semplice: perché se effettuo una verifica sull'esistenza di un file condiviso mi viene sempre restituito False?
Proviamo a rappresentare l'errore:


FileInfo file = new FileInfo(@"\\\\192.168.1.1\\C\\fileTest1.txt");
Response.Write(file.Exists.ToString()); 

Indicando informazioni corrette sul percorso remoto del file, quello che vedremo a video eseguendo la nostra pagina Web, sarà sempre False.

Il motivo è semplice come il quesito: nel momento in cui cerchiamo di interrogare il FileSystem del computer remoto, l'applicativo .NET ci logga come utente predefinito per le pagine .ASPX (ASPNET o NETWORK SERVICE a seconda del sistema utilizzato - WinXP/2000 o Win2003) che, ovviamente, non possiede i permessi necessari anche solo per avere informazioni sul file.
Per ovviare al problema possiamo impersonare un altro utente (con le credenziali di uno esistente sulla macchina remota) ed eseguire il contesto attivo della chiamata HTTP mediante queste credenziali.


private enum LogonTypes : uint
{
    Interactive = 2,
    Network = 3,
    Batch = 4,
    Service = 5,
    NetworkCleartext = 8
}

private enum LogonProviders : uint
{
    Default = 0
}

protected void Page_Load(object sender, EventArgs e)
{
    if ( ImpersonateUserOnContext("", "Administrator", "abc") ) {
        FileInfo file = new FileInfo(@"\\\\192.168.1.1\\C\\fileTest1.txt");
        Response.Write(file.Exists.ToString());
    }
}

public static bool ImpersonateUserOnContext(string domain, string username, string password)
{
    bool r = false;
    IntPtr token;
    bool logged = LogonUser(
        username,
        domain,
        password,
        LogonTypes.Interactive,
        LogonProviders.Default,
        out token);
    if (logged)
    {
        ImpersonateLoggedOnUser(token);
        CloseHandle(token);
        r = true;
    }
    return r;
}

[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(
    string domain,
    string username,
    string password,
    LogonTypes logonType,
    LogonProviders logonProvider,
    out IntPtr token);

[DllImport("advapi32.dll", SetLastError = true)]
static extern bool ImpersonateLoggedOnUser(IntPtr handle);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr handle);


Agendo in questo modo e richiamando il metodo ImpersonateUserOnContext prima della chiamata al FileSystem avremo una risposta sicura sull'esistenza o meno del file remoto (assicuratevi che il file remoto esista effettivamente, poi provate prima con credenziali corrette poi con altre non corrette per vedere se il risultato cambia).

Scarica l'esempio per impersonificare un utente differente nel contesto Http Clicca qui per scaricare l'esempio di questo articolo

Commenti


Un buon Articolo...
Scritto da Ciro D'Aloia - venerdì 14 novembre 2008 alle ore 15.13

Ciao!! Sto cercando di usare questo codice per impersonare un utente di un altro dominio...mi spiego: devo creare un task schedulato su una macchina remoto che si trova sotto un altro dominio. Il Task me lo crea ma non setta la password e quindi il task non può partire. Sto tentando di usare questo codice ma non si logga mai come un altro utente es: impersonateUserOnContext("docdomain","admin","pwd"); ma niente il metodo restituisce sempre false! Devo cambiare qualcosa nel web.config? O la sintassi del dominio è sbagliata? Grazie per ogni suggerimento
Scritto da Massimiliano P. - martedì 13 ottobre 2009 alle ore 12.49



Scrivi nuovo commento

Autore:  
E-mail:
Sito:
Ricorda le mie informazioni:
Messaggio:
Verifica codice: Password verification

 

-- Anteprima commento --


Versione italiana Versione italiana

CATEGORIE

Ajax (2)
ASP.NET (11)
C# Code (4)
IIS (1)
Silverlight (1)
Sql Server 2000 (1)
Varie (4)
Visual Studio (4)

ARCHIVIO

aprile 2009 (1)
maggio 2008 (1)
aprile 2008 (1)
gennaio 2008 (4)
dicembre 2007 (1)
maggio 2007 (1)
febbraio 2007 (1)
dicembre 2006 (3)
ottobre 2006 (1)
settembre 2006 (3)
agosto 2006 (1)
giugno 2006 (1)

CHI SONO [curriculum]

Curriculum ZofM

RINGRAZIAMENTI