impersonation

21/10/2009 - 09:46 por josetellan | Informe spam
Hola a todos, les cuento el problema.
tengo una feature que sube en cada sitio creado una serie de masterpages y
aplica un tema determinado en funcion de la aplicacion en la que se crea
dicho sitio. las masterpages son para las paginas de contenido y tambien para
las paginas de administracion (/layouts). el cambio de masterpage lo hago a
traves de un httpmodule que segun que pagina se pida al servidor me pone una
master u otra. esa es la funcionalidad de mi codigo y todo lo hace genial
pero le falta lo mas importante. como la creacion de sitios debe ser con un
usuario con los permisos adecuados, adjunte un archivo de configuracion a la
feature llamado "siteConfigurator.config", desde el que leo un tag
<impersonate> con el user y pass del admin de la granja sin encriptar ni
nadapero como estaba en desarrollo pues me valia hasta lograr la
funcionalidad.
esos 3 valores (domain, user y pass) se le pasan a un metodo de una clase
llamada "impersonation.cs" que tiene este codigo:

public class Impersonation
{
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
private WindowsIdentity tempWindowsIdentity;


WindowsImpersonationContext impersonationContext;

[DllImport("advapi32.dll")]
public static extern int LogonUserA(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError =
true)]
public static extern int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError =
true)]
public static extern bool RevertToSelf();

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);

internal bool ImpersonateValidUser(String userName, String domain,
String password)
{
//WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;

if (RevertToSelf())
{
if (LogonUserA(userName, domain, password,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new
WindowsIdentity(tokenDuplicate);
impersonationContext =
tempWindowsIdentity.Impersonate();
if (impersonationContext != null)
{
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
}
}
}
}


if (token != IntPtr.Zero)
CloseHandle(token);
if (tokenDuplicate != IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
}

internal void UndoImpersonation()
{
impersonationContext.Undo();
}
}

la funcion nos devuelve true si el token es valido. mi pregunta escual
es la mejor manera ( donde colocarlos, como recogerlos y como pasarlos) de
recoger los valores de domain , user y pass para pasarselos a esta clase



les cuento lo que he probado hasta ahora:

en primer lugar lei el tema de "aspnet_regiis -pe ." para encriptar
secciones de web.config ´s...y lo hacia genial pero no se por qué las
busquedas dejaban de funcionar y como las busquedas son tan importantes en la
intranet de mi empresa pues se ha decidio combiar de estrategia. y en segundo
lugar probe a insertar el codigo referente a runwithelevatedprivileges pero
me da algunos errores que me hacen preguntarme si voy por el buen camino.

muchas gracias de antemano y un saludo.
 

Leer las respuestas

#1 Hans Baumann
22/10/2009 - 10:46 | Informe spam
En principio como yo lo hacía para evitar cualquier problema era encriptar
el usuario y la contraseña en el web.config, pero sólo esos dos datos.

Es lo mas sencillo y directo que se me ocurre.

Un saludo,


"josetellan" escribió en el mensaje
de noticias news:
Hola a todos, les cuento el problema.
tengo una feature que sube en cada sitio creado una serie de masterpages y
aplica un tema determinado en funcion de la aplicacion en la que se crea
dicho sitio. las masterpages son para las paginas de contenido y tambien
para
las paginas de administracion (/layouts). el cambio de masterpage lo hago
a
traves de un httpmodule que segun que pagina se pida al servidor me pone
una
master u otra. esa es la funcionalidad de mi codigo y todo lo hace genial
pero le falta lo mas importante. como la creacion de sitios debe ser con
un
usuario con los permisos adecuados, adjunte un archivo de configuracion a
la
feature llamado "siteConfigurator.config", desde el que leo un tag
<impersonate> con el user y pass del admin de la granja sin encriptar ni
nadapero como estaba en desarrollo pues me valia hasta lograr la
funcionalidad.
esos 3 valores (domain, user y pass) se le pasan a un metodo de una clase
llamada "impersonation.cs" que tiene este codigo:

public class Impersonation
{
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
private WindowsIdentity tempWindowsIdentity;


WindowsImpersonationContext impersonationContext;

[DllImport("advapi32.dll")]
public static extern int LogonUserA(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError > true)]
public static extern int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError > true)]
public static extern bool RevertToSelf();

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);

internal bool ImpersonateValidUser(String userName, String domain,
String password)
{
//WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;

if (RevertToSelf())
{
if (LogonUserA(userName, domain, password,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new
WindowsIdentity(tokenDuplicate);
impersonationContext > tempWindowsIdentity.Impersonate();
if (impersonationContext != null)
{
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
}
}
}
}


if (token != IntPtr.Zero)
CloseHandle(token);
if (tokenDuplicate != IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
}

internal void UndoImpersonation()
{
impersonationContext.Undo();
}
}

la funcion nos devuelve true si el token es valido. mi pregunta escual
es la mejor manera ( donde colocarlos, como recogerlos y como pasarlos) de
recoger los valores de domain , user y pass para pasarselos a esta clase



les cuento lo que he probado hasta ahora:

en primer lugar lei el tema de "aspnet_regiis -pe ." para encriptar
secciones de web.config ´s...y lo hacia genial pero no se por qué las
busquedas dejaban de funcionar y como las busquedas son tan importantes en
la
intranet de mi empresa pues se ha decidio combiar de estrategia. y en
segundo
lugar probe a insertar el codigo referente a runwithelevatedprivileges
pero
me da algunos errores que me hacen preguntarme si voy por el buen camino.

muchas gracias de antemano y un saludo.

Preguntas similares