Как я могу исправить проблему двойного прыжка Kerberos?

- вы уверены, что вызов веб-служб из веб-приложения и я надеялся, что кто-то здесь сможет помочь. Из того, что я могу сказать, это кажется чтобы иметь какое-то отношение к Kerberos проблема двойного прыжка. Однако, если это так, я не уверен, что делать, чтобы действительно решить проблему. Чтобы сделать вещи сложнее, у меня нет надлежащих разрешений для внесения изменений в учетные записи Active Directory, поэтому мне нужно знать, что просить при запросе изменения. В моей ситуации, мне нужно передавать учетные данные (встроенная проверка подлинности Windows) из веб-приложения на веб-службу, чтобы веб-служба выполняется в контексте пользователя.

вот мой точный вопрос:

это работает

Working scenario

это не работает

Non-working scenario

на только разница между рабочим сценарием и нерабочим сценарий заключается в том, что рабочий сценарий запускает приложение на localhost (будь то ПК разработчика или на соответствующем сервере), а нерабочий пример выполняется на другом компьютере. Код между обоими сценариями абсолютно одинаков.

что я пробовал

  1. добавление SPN в учетную запись домена, которая запускает пул приложений для каждого сервера setspn -a http/server1 DOMAINaccount
  2. различные методы олицетворения
  3. удаление код олицетворения using(...) и выполнение вызова веб-службы в качестве учетной записи пула приложений. Это работает, как и ожидалось.

есть ли у кого-нибудь идеи о том, что я мог бы сделать, чтобы исправить эту проблему?

2 ответов


промежуточный сервер должен быть доверена для делегирования. В противном случае учетные данные не будут делегированы, а промежуточный сервер не сможет олицетворять исходный клиент.


чаще всего причина в том, что сервер 1 не передает маркер делегирования серверу 2. Поэтому, когда сервер 2 пытается использовать этот билет аутентификации, чтобы пойти куда-то еще (возможно, SQL server), он терпит неудачу.

вы должны установить уровень олицетворения для вызова WCF

ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation

http://msdn.microsoft.com/en-us/library/system.servicemodel.security.windowsclientcredential.allowedimpersonationlevel.aspx