ASP.Net (IIS 7.5) Запрос Active Directory без учетных данных пользователя - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть несколько веб-приложений, которые я создал для нашей интрасети.Я хотел, чтобы пользователи не беспокоились о входе в систему, поэтому эти приложения извлекают пользователя, вошедшего в систему, когда они заходят на сайт.Я использовал этот код для этого:

Dim userName As String = User.Identity.Name
CurrentUser = userName.Substring(userName.IndexOf("\") + 1)

Это работает как шарм, здесь никаких проблем.Следующим шагом является запрос Active Directory для того, кто вошел в систему, чтобы получить различную информацию.То, как я сейчас его запрограммировал, работает как чудо на стороне разработчика (типично, потому что я не использую IIS).

Проблема возникает, когда я публикую ее на своем сервере IIS (Windows Server 2008 R2 работаетIIS 7.5), я получаю сообщения об ошибках, которые указывают на конкретную строку в моем коде, который запрашивает Active Directory.Интересно то, что эти приложения прекрасно работали на прошлой неделе.Они сломались после того, как мой администратор сервера выполнил последнюю партию обновлений Windows (обратите внимание, я запускаю их с использованием .Net Framework 4.0)

До того, как я настроил каждое приложение так, чтобы аутентификация Windows была включена, другие типы аутентификациибыли отключены.Для провайдеров переговоры № 1, NTLM № 2.Для Расширенных настроек, Расширенная защита = Выкл. И Включить проверку подлинности в режиме ядра.

Мой web.config имеет следующий набор:

<customErrors mode="Off"/>
<authentication mode="Windows" />
<authorization>
  <deny users="?"/>
</authorization>

Это были настройки, которые у меня были, ивсе работало как шарм.Теперь, чтобы заставить его работать, мне нужно поменять местами провайдеров, чтобы NTLM был # 1, а Negotiate - # 2.Из-за этого учетные данные пользователя не передаются должным образом, и запрос AD не выполняется.Это кодировка, которую я использую для запроса:

Dim adSearchRoot As New DirectoryEntry("LDAP://DC=[DOMAIN],DC=com")
Dim adSearch As New DirectorySearcher(adSearchRoot)

adSearch.Filter = "(&(ObjectClass=User)(sAMAccountName=" & CurrentUser & "))"
Dim searchResult As SearchResult = adSearch.FindOne()

С тех пор, как при обновлении, при загрузке сайта с Negotiate впереди, это приводит к сбою в нижней строке, потому что у меня нет имени пользователя /пароль установлен для DirectoryEntry.Даже когда я устанавливаю имя пользователя / пароль, он все равно не работает на 100%, как раньше.

Таким образом, у меня возникает вопрос: что мне нужно сделать, чтобы пользователь зашел на сайт, я могу знать ихимя пользователя, и может запрашивать активный каталог, не требуя использования имени пользователя / пароля в DirectoryEntry ??

Это настройка в IIS?Или мне нужно перекодировать?Возможно, настройка web.config?Нужно ли мне возвращать обновления сервера и выяснять, какой из них приводит к разрыву?

Спасибо за совет заранее.Если у вас есть какие-либо вопросы, чтобы помочь ответить на вопрос, дайте мне знать.

ОБНОВЛЕНИЕ

Я попытался, как предложил Мэтт, добавив следующий клип в мой файл web.config:

<security>
  <authorization>
    <add accessType="Deny" users="?" />
  </authorization>
</security>

Это не сработало.Я немного почитал, а затем изменил этот раздел:

<location path="Default Web Site/NameOfApp">
  <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication enabled="false"/>
        <windowsAuthentication enabled="true">
          <providers>
            <add value="Negotiate" />
            <add value="NTLM" />
          </providers>
        </windowsAuthentication>
      </authentication>
      <authorization>
        <add accessType="Deny" users="?" />
      </authorization>
    </security>
  </system.webServer>
  </location>

При этом я также удалил строку, которая была выше в моем разделе web.config.Это тоже не сработало (к вашему сведению, это была отличная ссылка http://www.iis.net/ConfigReference/system.webServer/security/authentication)

Затем я наткнулся на эту статью: http://social.technet.microsoft.com/Forums/en/winserverDS/thread/7deba16b-295a-4887-98f9-9f291ed49871, которая, похоже, была похожей ситуацией. В этой статье в конце концов упоминалась «Двойной прыжок».", посмотрев на это и попробовав несколько вещей, это тоже не решило мою проблему.

Следующий шаг

Я собираюсь попробовать новый IIS 7.5внедрение в другой системе Server 2008 R2 и, по сути, начать с нуля, чтобы увидеть, воссоздает ли проблема или нет.

ЛЮБЫЕ новые предложения будут очень полезны.

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Мне удалось без проблем выполнить код на Windows 2008 Server.Я создал новый пул приложений .NET 4.0 и назначил его веб-приложению.Я изменил web.config, чтобы запретить анонимный доступ и использовать аутентификацию Windows.Код выполняется без исключения.

Глядя на ваш клип web.config, мне интересно, может быть, это то, что вам не хватает:

  <system.webServer>
    <security>
      <authorization>
        <add accessType="Deny" users="?" />
      </authorization>
    </security>
  </system.webServer>

Важно, чтобы у вас был этот раздел авторизации внутрираздел system.webServer .IIS 7 использует раздел system.webServer для хранения некоторых параметров, которые были частью метабазы ​​в IIS 6.

0 голосов
/ 10 апреля 2012

У меня была такая же проблема.Вот как я решил это:

Используйте перегрузку 4 из 5 для конструктора DirectoryEntry, который учитывает не только путь, но также имя пользователя и пароль.Итак, ваше AD-соединение должно выглядеть так:

DirectoryEntry adSearchRoot = new DirectoryEntry("LDAP://DC=[DOMAIN],DC=com", "DOMAIN\Username", "Password");
DirectorySearcher adSearch = new DirectorySearcher(entry);

Теперь вместо «DOMAIN \ Username» используйте служебную учетную запись, а затем для пароля, очевидно, используйте пароль для служебной учетной записи.

Я думаю, что, пока учетная запись службы является членом группы «Пользователи домена», у вас не возникнет проблем с запросом AD.

...