2009-09-10 3 views
2

Я разрабатываю сайт интрасети asp.net с помощью ActiveDirectoryMembershipProvider и SqlProfileProvider.ProfileProvider: получить список всех профилей

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

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

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

Этот подход, однако, не по следующим причинам:

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

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

ответ

2

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

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

1
ProfileInfoCollection profiles = ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All); 
foreach (ProfileInfo pi in profiles) 
{ 
    ProfileCommon p = Profile.GetProfile(pi.UserName); 
    countries.Add(p.Country);   
}