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.

Preguntas similare

Leer las respuestas

#11 Hans
29/10/2009 - 07:44 | Informe spam
Ojo, yo sólo encriptaba la variable que metía dentro de appsettings, no el
webconfig completo, para ello utilicé cualquier método de encriptación que
ofrece .net...

Es decir, me hacía una mini-api con dos métodos, encriptar y desencriptar,
con ellos encriptaba el usuario y la contraseña y los guardaba como
cualquier variable de configuración en el web.config, y cuando los leía, los
desencriptaba antes de pasar esos datos a los métodos definitivos.

http://hansbaumann.net
"josetellan" escribió en el mensaje
de noticias news:

Hola Hans, voy a hacer el tema de la impersonation de las 2 formas que se
me
han aconsejadola tuya y la del codigo privilegiado.
sobre tu solucion de encriptar el web.config de
c:\inetpub\wwwroot\wss\virtualdirectories\[puerto de tu aplicación web] .
¿lo
encriptas por aspnet_regiis o por algun otro metodo? y ¿Como recoges los
valores desde el code behind?

muchas gracias hans.
Respuesta Responder a este mensaje
#12 josetellan
29/10/2009 - 07:58 | Informe spam
Hola de nuevo , pues mira que me dio dolor de cabeza el impersonate=true. de
todas formas intentare poner codigo privilegiado en otra parte que tambien es
necesario y a ver cual rinde mas.

muchisimas gracias por tu ayuda.

Saludos.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida