2013-09-25 1 views
1

я следующий блок кода, который запрашивает Active Directory для пользователей по имени группы с помощью System.DirectoryServices.AccountManagement:Получение ошибки Запрос Active Directory только на сервере

var domainContext = new PrincipalContext(ContextType.Domain, "company.container.internal"); 
var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "Lvl1Users"); 
if (groupPrincipal != null) 
{ 
    //Read the values 
} 

Теперь сайт использует следующее:

  • IIS7 на Win2k8
  • подлинности Windows
  • олицетворения = True
  • App Pool на .NET 4.0 с использованием «NETWORK SERVICE» в качестве учетной записи

На моей локальной машине (вы знаете, как это происходит) все отлично работает. Мои сверстники, которые пробуют его локально, также хорошо работают. Однако после развертывания на сервере он показывает следующее:

Произошла ошибка в работе.

Все, что я изучаю, говорит, что это вопрос с разрешениями. 1 вещь, чтобы отметить, на моей локальной машине я на домене MainNetwork, который является родительским доменом company.container.internal, который я запрашиваю. Машина IIS находится на company.container.internal и запрашивает тот же домен. Честно говоря, я думаю, что более сложной ситуацией является чтение AD на моей локальной машине, которая находится в другом домене, но она работает. На сервере, который запрашивает тот же домен, он терпит неудачу.

Вот что я пытался, и ни один из них не работал:

  • Изменение AppPool к «LocalSystem»
  • Изменить AppPool использовать статический супер-пупер учетную запись администратора
  • Используется олицетворение кода для управления контекстом вызовов в локальном блоке с пользователем администратора в домене MainNetwork.
  • Используется олицетворение кода для управления контекстом вызовов в локальном блоке с пользователем admin в домене company.container.internal.
  • Добавление в using (HostingEnvironment.Impersonate())

Что дает здесь? Я пробовал выдавать себя за каждого типа полномочий администратора в обоих доменах и использовал несколько параметров AppPool, и я продолжаю получать ту же ошибку. Есть ли что-то, что необходимо изменить в коде с объявлением доменов, или есть проблема с правами доступа, которые я пропускаю?

ответ

2

Я понял это, и оказалось, что с помощью HostingEnvironment.Impersonate() все еще было в корне, чтобы решить проблему. Я уже пробовал это, но была другая проблема с моим кодом.

Проблема заключается в том, что контекст, для которого выполняются вызовы Active Directory, находится под пользователем, который не имеет разрешений (также может произойти, когда identity impersonate="true" в ASP.NET, из-за того, что токен пользователя является " вторичный токен ", который не может использоваться при аутентификации на другом сервере: http://bit.ly/1753RjA).

Следующий код гарантирует, что выполняемый блок кода запущен в контексте, скажем, AppPool (т.NETWORKSERVICE), на котором работает сайт ASP.NET.

using (HostingEnvironment.Impersonate()) 
{ 
    var domainContext = new PrincipalContext(ContextType.Domain, "myDomain.com"); 
    var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "PowerUsers"); 
    if (groupPrincipal != null) 
    { 
     //code to get the infomation 
    } 

} 

Однако один супер важная деталь в том, что весь код вызова Active Directory должен быть в этом блоке. Я использовал код, который написал мой член команды, который возвращал результаты запроса LINQ типа Users (пользовательский класс), но не оценивал выражение (неверная практика). Поэтому дерево результатов было возвращено вместо результатов.

В результате получилось, что вызывающий код в конечном итоге оценил результаты, и сообщение An operations error occurred все еще появилось. Я, хотя исправление кода выше не работает. Когда это действительно так, но был код, оценивающий результаты вне блока.

В двух словах, убедитесь, что все кодом для доступа к Active Directory находится внутри этого блока using и исключение должно быть установлено один сервис/приложение будет развернуто на сервер.

Смежные вопросы