Я видел много сообщений о проблеме двойного перехода WCF с олицетворением, но ни одна из них не помогла мне решить мою проблему.
Что мне не хватает? Что еще мне нужно сделать, чтобы сохранить моего олицетворенного пользователя (DOMAIN \ UserName) в Сервисе 2? Я смотрю ServiceSecurityContext.Current.WindowsIdentity.Name, чтобы подтвердить - возможно, это неправильно.
Настройка:
- Клиентское приложение, размещенное на локальном хосте IIS, со ссылкой на службу 1 - олицетворение WindowsIdentity (DOMAIN \ UserName)
- Служба 1 - служба WCF, размещенная на локальном хосте IIS, со ссылкой на службу 2
- Служба 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).
1 ответ
Как оказалось, критически важной частью в моем случае было обеспечение установки следующего атрибута поведения:
<serviceAuthorization impersonateCallerForAllOperations="true" />
Раньше, когда я устанавливал это значение, я получал ошибки в Entity Framework, поэтому я отменил настройку. Похоже, что где-то в процессе согласования моей настройки со стандартной реализацией (как описано в других сообщениях о varios) я смог в конечном итоге установить этот атрибут и заставить его работать, как ожидалось.
Редактировать: Если все это работает локально, но не работает в распределенной среде, ознакомьтесь с этим сообщением: Как исправить проблему двойного перехода Kerberos?. Вероятно, вам нужно настроить машины на доверительное делегирование друг другу.
Похожие вопросы
Связанные вопросы
Новые вопросы
wcf
Windows Communication Foundation является частью .NET Framework, которая предоставляет унифицированную модель программирования для быстрого создания сервис-ориентированных приложений.