Как делегировать сеанс аутентификации Windows при запуске приложения в IIS 8?

У меня есть приложение для интрасети, написанное с помощью С# в верхней части ASP.Net MVC 5 Framework. Мое приложение настроено на проверку подлинности пользователей с помощью метода "Аутентификация Windows". Это приложение работает на IIS 8.

Мое приложение использует сторонний SDK для взаимодействия с другой программой, которую я запускаю в том же домене. Это стороннее приложение позволяет пользователю входить в систему с использованием проверки подлинности Windows также через предоставленный SDK.

Проблема

Однако сервер, с которым SDK обменивается данными, всегда возвращает "Недопустимое имя пользователя/пароль".

После глубокого устранения неполадок я узнал, что IIS не возвращает правильное имя пользователя. Вместо того, чтобы возвращать "Проверенный пользователь", он возвращает пользователя, запускающего приложение пула. Итак, чтобы исправить эту проблему, я меняю настройки приложения на следующие

  • Я отключил "Анонимную аутентификацию"
  • Я включил "Аутентификацию Windows"
  • Я включил "олицетворение ASP.NET", в то время как для параметров "олицетворения ASP.NET" установлено значение "Аутентифицированный пользователь". Заметка: что для этого требуется "классический" управляемый трубопровод не "интегрирован" для по какой-то причине.
  • Я меняю настройки управляемого конвейера AppPool на "Классический" v4
  • Изменен пользователь, на котором запущен AppPool, на "Сетевая служба" вместо "ApplicationPoolId"
  • Затем список поставщиков аутентификации сохранил список "Переговоры" и "NTLM"
  • Наконец, я включил "аутентификацию в режиме ядра".

Таким образом, приведенные выше настройки вернули правильное имя пользователя, но это не делегирование пароля в SDK. Я думаю, из-за коммуникационной панели IIS защищает зарегистрированного пользователя и не позволяет мне делегировать пароль другой службе /SDK.

Итак, я попытался изменить свою настройку на следующий

  • Я меняю настройки управляемого конвейера AppPool на "Integrated" v4.0
  • Изменен пользователь, на котором запущен AppPool, на "Сетевая служба"
  • Я отключил "Анонимную аутентификацию"
  • Я включил "Аутентификацию Windows"
  • я отключено "Олицетворение ASP.NET"
  • Список поставщиков аутентификации "Ведение переговоров: Kerberos", "Negotiate" и "NTLM"
  • Я отключил "аутентификацию в режиме ядра", поскольку он не будет работать с поставщиком "Kerberos".

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

Чтобы исправить это, я нашел имя своего веб-сервера в своем контроллере домена, и я перешел на вкладку "Делегация" и изменил его на "Доверять этому пользователю делегирование любой службе (только Kerberos)"

Нет этой настройки, она позволила мне войти в мое приложение MVC. Но на этот раз он не делегирует ни имя пользователя, ни пароль для SDK. Фактически, имя пользователя, которое я получаю, является именем пользователя PoolApp, а не аутентифицированным пользователем.

Чтобы охватить все мои базы, я изменяю пользователя, который является AppPool, фактическому пользователю, имеющему доступ к проверке подлинности Windows на Сервер, к которому подключается SDK. Разумеется, это сработало отлично, и я могу подключиться ко второй услуге. Тем не менее, всегда делегирует имя пользователя/пароль, запускающее AppPool, в SDK вместо делегирования подключенного/аутентифицированного имени пользователя/пароля.

В заключение IIS не делегирует имя пользователя/пароль в SDK по какой-то причине. Как я могу заставить IIS делегировать подключенный пользовательский сеанс/учетные данные другой службе?

Также возможно, что делегирование происходит неудачно, поскольку пользователи используют аутентификацию NTLM вместо Kerberos, но сервер будет делегировать только при проверке подлинности Kerberos. "Если это так, как я могу заставить пользователя используйте аутентификацию Kerberos вместо" NTLM?

Ответ 1

Вы пытались включить олицетворение в своем web.config?

<configuration>
    <system.web>
        <identity impersonate="true" />
    </system.web>
</configuration>

Если это не работает, вам может потребоваться включить делегирование для этого компьютера в ActiveDirectory. См. Здесь: fooobar.com/questions/16548/...

Ответ 2

Чтобы установить приоритет конкретного поставщика проверки подлинности, вы можете перемещать вверх или вниз по одному в списке поставщиков проверки подлинности. Откройте функцию Аутентификация вашего веб-приложения в диспетчере IIS и выберите элемент проверки подлинности Windows. На панели Действие нажмите кнопку Провайдеры.... Список поставщиков будет открыт, вы можете добавить конкретного провайдера и переместить один на другой.

Поставщики аутентификации

Но я не уверен, что это поможет вам. Вы можете запускать сторонние программы, используя встроенные идентификаторы IUSR или пула приложений или специальную учетную запись пользователя (см. Kev post). Используйте фильтры авторизации для контроллера MVC, который вызывает эти программы для ограничения доступа.

Сообщение @fboers предлагает мне следующую идею: вы могли бы попытаться использовать олицетворение олицетворения для вашей проблемы. Откройте функцию Аутентификация и включите аутентификацию олицетворения ASP.NET, затем нажмите Изменить на панели Действия и выберите вариант "Идентифицированный пользователь". В этом случае сервер IIS должен запускать приложения в указанном контексте безопасности.

Ответ 3

  • Откройте Visual Studio
  • Щелкните правой кнопкой мыши на своем веб-проекте → Свойства
  • Проверьте настройки ниже введите описание изображения здесь

  • Попробуйте включить его и перераспределите, чтобы увидеть, что произойдет

Обновление

Попробуйте этот код в своем веб-проекте

var impersonation = ((System.Security.Principal.WindowsIdentity)this.HttpContext.User.Identity).Impersonate();

// ...
// Call to SDK                
// ...

impersonation.Undo();

Кажется, SDK использует System.Security.Principal.WindowsIdentity.GetCurrent(), этот метод возвращает идентификатор процесса, запускающего пул приложений. Функция impersonate() заменит ее олицетворенной идентичностью и передаст ее до более позднего кода потока до тех пор, пока не вызывается Undo().

Примечание. Я пробовал этот код в контроллере MVC, это причина "this.HttpContext"