Dynamic Impersonation in ASP.net
Spesso può capitare che un'applicazione Web voglia utilizzare le credenziali dell'utente collegato per fornire accesso a risorse di sistema, quali file o directories. La soluzione più utilizzata si basa sull'uso dell'elemento <identity> del file web.config, impostato con l'attributo impersonate="true".
Questa soluzione ha come effetto quello di far girare il processo che serve le richieste dell'utente X con le credenziali ed i poteri dell'utente X. La cosa può andare bene nella maggior parte dei casi, ma per il principio del minimo privilegio, sarebbe meglio rimuovere l'impersonamento dell'utente e far sì che solo determinate regioni di codice, ove richiesto, girino con le credenziali dell'utente, mentre il rimanente codice venga eseguito dall'utente NETWORK SERVICE (oppure <NOMEMACCHINA>\ASPNET) o da un altro utente a bassi privilegi.
In ASP.net questo è facilmente realizzabile e possiamo vederlo nel seguente snippet:
Response.Write(WindowsIdentity.GetCurrent().Name + "<br>")
Dim _ctx As WindowsImpersonationContext = CType(User.Identity, WindowsIdentity).Impersonate
'''============================================================================
''' Da qui in poi il codice viene eseguito con l'identità dell'utente collegato
Response.Write(WindowsIdentity.GetCurrent().Name + "<br>")
Try
Dim _sr As IO.StreamReader = System.IO.File.OpenText(Server.MapPath("SecretFile.xml"))
Response.Write("File aperto!<br>")
_sr.Close()
Catch ex As UnauthorizedAccessException
Response.Write("Non sei autorizzato!<br>")
End Try
_ctx.Undo()
''' Qui termina il codice eseguito con le credenziali dell'utente connesso
'''============================================================================
Response.Write(WindowsIdentity.GetCurrent().Name + "<br>")
indietro