ProfileProvider: récupère la liste de tous les profils
-
05-07-2019 - |
Question
Je développe un site Web intranet asp.net avec un ActiveDirectoryMembershipProvider et un SqlProfileProvider.
L’une des exigences de mon site Web est d’avoir un " Anniversaires " page, ce qui m'obligerait à répertorier tous les profils et à récupérer les informations de date de naissance.
J'ai abordé le problème comme suit:
- Invoquer la méthode statique Membership.GetAllUsers ();
- Parcourez la liste des utilisateurs et récupérez le profil à partir du nom d'utilisateur du membre
Cette approche a toutefois échoué pour les raisons suivantes:
- La webapp emprunte l'identité de l'utilisateur connecté actuel pour récupérer ses détails AD (identité impersonate = "true" dans le fichier Web.config), de sorte que j'obtiens une exception "l'accès est refusé". en essayant d'invoquer les GetAllUsers
- Si j'essaie de faire en sorte que l'application Web emprunte l'identité d'un compte de super utilisateur, AD renvoie les noms d'utilisateur sous le format nom d'utilisateur @ nom de domaine, mais dans mon fournisseur de profil, ils étaient initialement stockés sous le format nom de domaine \ nom d'utilisateur.
Alors, comment résoudre ce problème pour récupérer la liste complète des profils de n'importe quel membre de l'organisation?
La solution 2
Il existe un ProfileManager avec la méthode a GetAllProfiles ():
http://msdn.microsoft .com / fr-us / library / system.web.profile.profilemanager.getallprofiles.aspx
Autres conseils
Bien que je ne l'aie jamais fait auparavant, vous pouvez essayer de créer un contexte d'emprunt d'identité secondaire, mais une fois établi, l'appel à GetAllUsers
devrait réussir.
Découvrez http://chiragrdarji.blogspot.com /2007/03/impersonation-using-code.html , ce chapitre semble avoir modifié son contexte de sécurité en utilisant la classe System.Security.Principal.WindowsIdentity
avec . System.Security.Principal.WindowsImpersonationContext
. Cela vaut peut-être la peine de vérifier.
ProfileInfoCollection profiles = ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);
foreach (ProfileInfo pi in profiles)
{
ProfileCommon p = Profile.GetProfile(pi.UserName);
countries.Add(p.Country);
}