Я видел много сообщений о проблеме двойного перехода WCF с олицетворением, но ни одна из них не помогла мне решить мою проблему.

Что мне не хватает? Что еще мне нужно сделать, чтобы сохранить моего олицетворенного пользователя (DOMAIN \ UserName) в Сервисе 2? Я смотрю ServiceSecurityContext.Current.WindowsIdentity.Name, чтобы подтвердить - возможно, это неправильно.

Настройка:

  1. Клиентское приложение, размещенное на локальном хосте IIS, со ссылкой на службу 1 - олицетворение WindowsIdentity (DOMAIN \ UserName)
  2. Служба 1 - служба WCF, размещенная на локальном хосте IIS, со ссылкой на службу 2
  3. Служба 2 - Служба WCF, размещенная на локальном хосте IIS

Я использую ВСЕ basicHttpBindings, чтобы упростить задачу. Я установил SPN на обеих конечных точках службы.

  • Я могу успешно СДЕЛАТЬ двойной прыжок, и код работает нормально
  • В службе 1 (переход 1) мой ServiceSecurityContext.Current.WindowsIdentity - это человек, которого я олицетворял (DOMAIN \ UserName)
  • В службе 2 (переход 2) мой ServiceSecurityContext.Current.WindowsIdentity является пользователем пула приложений IIS.
  • ImpersonationLevel = "Делегирование"
  • В обеих службах WCF включена проверка подлинности Windows и отключена анонимность.

** Примечание: я запускаю все это локально на своем компьютере разработчика. Тем не менее, у меня установлен уровень делегирования, позволяющий делегировать от себя самому себе. Может быть, перебор.

Связывание (аналогично для обоих сервисов):

<binding name="...">
    <security mode="TransportCredentialOnly">
         <transport clientCredentialType="Windows" />
    </security>
</binding>

Я установил impersonationLevel = "Delegation" как для клиента службы WCF, так и для конфигурации поведения конечной точки службы. Мои методы обслуживания специально украшены impersonationOption = "Allowed" (переход 1) и impersonationOption "Required" (переход 2).

2
chrisriesgo 19 Мар 2013 в 03:22
Можно ли показать код или конфигурацию, относящуюся к тому, как вы настроили олицетворение?
 – 
EdmundYeung99
19 Мар 2013 в 04:31
Привет, Эдмунд. Я добавил базовую конфигурацию привязки. В частности, что еще вам было бы интересно увидеть?
 – 
chrisriesgo
19 Мар 2013 в 04:46
Где вы настраиваете уровень олицетворения?
 – 
EdmundYeung99
19 Мар 2013 в 07:43
Пожалуйста, посмотрите мои последние правки
 – 
chrisriesgo
19 Мар 2013 в 14:03

1 ответ

Лучший ответ

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

<serviceAuthorization impersonateCallerForAllOperations="true" />

Раньше, когда я устанавливал это значение, я получал ошибки в Entity Framework, поэтому я отменил настройку. Похоже, что где-то в процессе согласования моей настройки со стандартной реализацией (как описано в других сообщениях о varios) я смог в конечном итоге установить этот атрибут и заставить его работать, как ожидалось.

Редактировать: Если все это работает локально, но не работает в распределенной среде, ознакомьтесь с этим сообщением: Как исправить проблему двойного перехода Kerberos?. Вероятно, вам нужно настроить машины на доверительное делегирование друг другу.

1
Community 23 Май 2017 в 15:04
1
Что это добавило к услуге 1 или услуге 2?
 – 
Cᴏʀʏ
12 Сен 2013 в 00:10
Сервис 2 и 1 в моем случае. См. Также мои дополнительные примечания к ответам. Вы можете столкнуться со второй проблемой.
 – 
chrisriesgo
12 Сен 2013 в 04:18