ProfileProvider: получить список всех профилей - PullRequest
2 голосов
/ 10 сентября 2009

Я разрабатываю сайт интрасети asp.net с ActiveDirectoryMembershipProvider и SqlProfileProvider.

Одним из требований моего веб-сайта является наличие страницы «Дни рождения», которая потребовала бы от меня перечисления всех профилей и получения информации о дне рождения.

Я подошел к проблеме следующим образом:

  • Вызвать статический метод Membership.GetAllUsers ();
  • Перебирайте список пользователей и извлекайте профиль из имени пользователя участника

Однако этот подход не удался по следующим причинам:

  • Веб-приложение олицетворяет текущего зарегистрированного пользователя, чтобы получить его данные AD (identity impersonate = "true" в web.config), поэтому я получаю исключение "доступ запрещен" при попытке вызвать GetAllUsers
  • Если я попытаюсь сделать веб-приложение имитирующим учетную запись суперпользователя, AD возвращает имена пользователей в формате username @ domain-name, но в моем провайдере профиля они изначально были сохранены в формате domain-name \ username.

Итак, как бы вы обошли эту проблему, чтобы получить полный список профилей для любого члена организации?

Ответы [ 3 ]

2 голосов
/ 10 сентября 2009

Существует ProfileManager с методом GetAllProfiles ():

http://msdn.microsoft.com/en-us/library/system.web.profile.profilemanager.getallprofiles.aspx

2 голосов
/ 10 сентября 2009

Хотя я никогда не делал этого раньше, вы можете попытаться создать вторичный контекст олицетворения, чтобы при его установлении вызов GetAllUsers завершился успешно.

Взгляните на http://chiragrdarji.blogspot.com/2007/03/impersonation-using-code.html,. Этот глава, похоже, добился изменения в контексте безопасности, используя класс System.Security.Principal.WindowsIdentity вместе с System.Security.Principal.WindowsImpersonationContext. Может стоит проверить.

1 голос
/ 30 декабря 2011
ProfileInfoCollection profiles = ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);
foreach (ProfileInfo pi in profiles)
{
    ProfileCommon p = Profile.GetProfile(pi.UserName);
    countries.Add(p.Country);        
}
...