Proveedor de Perfil: recupera la lista de todos los perfiles
-
05-07-2019 - |
Pregunta
Estoy desarrollando un sitio web de intranet de asp.net con un ActiveDirectoryMembershipProvider y un SqlProfileProvider.
Uno de los requisitos de mi sitio web es tener un " Cumpleaños " página, que me obliga a enumerar todos los perfiles y recuperar la información de cumpleaños de ella.
Abordé el problema de la siguiente manera:
- Invoque el método estático Membership.GetAllUsers ();
- Iterar a través de la lista de usuarios y recuperar el perfil del nombre de usuario del miembro
Sin embargo, este enfoque falló por los siguientes motivos:
- La aplicación web se hace pasar por el usuario registrado actual para recuperar sus detalles de AD (identidad suplantada = "verdadero" en el web.config), así que obtengo una excepción " acceso denegado " al intentar invocar los GetAllUsers
- Si intento hacer que la aplicación web se haga pasar por una cuenta de superusuario, AD devuelve los nombres de usuario como formato de nombre de usuario @ nombre de dominio, pero en mi proveedor de perfil se almacenaron inicialmente como formato de nombre de dominio \ nombre de usuario.
Entonces, ¿cómo resolvería este problema para recuperar la lista completa de perfiles para cualquier miembro de la organización?
Solución 2
Hay un ProfileManager con el método GetAllProfiles ():
http://msdn.microsoft .com / en-us / library / system.web.profile.profilemanager.getallprofiles.aspx
Otros consejos
Aunque nunca lo he hecho antes, podría intentar crear un contexto de suplantación secundario, que cuando se establezca, la llamada a GetAllUsers
debería tener éxito.
Echa un vistazo a http://chiragrdarji.blogspot.com /2007/03/impersonation-using-code.html , este capítulo parece haber logrado un cambio en el contexto de seguridad al usar la clase System.Security.Principal.WindowsIdentity
junto con System.Security.Principal.WindowsImpersonationContext
. Podría valer la pena echarle un vistazo.
ProfileInfoCollection profiles = ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);
foreach (ProfileInfo pi in profiles)
{
ProfileCommon p = Profile.GetProfile(pi.UserName);
countries.Add(p.Country);
}