Надеюсь, кто-то может помочь!
Я звоню в службу WCF с использованием JSON, но не могу получить учетные данные пользователя.
Мы используем Kerberos, поэтому IIS настроен следующим образом:
Задачи на стороне сервера:
- IIS сервер является членом домена
- Установить учетную запись компьютера сервера IIS в MMC AD Users & Computers как «Доверенная для делегирования»
- Сервер IIS необходимо перезагрузить, чтобы эта политика вступила в силу.
- Для сайта / виртуального каталога должна быть выбрана только встроенная проверка подлинности Windows
- В IIS нельзя использовать NTLM только в качестве метода аутентификации (обычно это не проблема, NEGOTIATE используется по умолчанию, поэтому, если вы специально не запустили скрипт для его изменения, не беспокойтесь об этом).
- Имя сервера IIS либо должно точно соответствовать имени учетной записи в AD, либо инструмент SetSPN следует использовать в тех случаях, когда в качестве альтернативного имени установлен сайт IIS (например, сервер называется server01.domain.com, а веб-сайт называется www.application). ком).
Клиентские задачи
- Клиент должен использовать IE 5.x +. Если клиент работает под управлением IE 6, убедитесь, что в разделе «Инструменты»> «Свойства обозревателя»> «Дополнительно» выбрано «Включить встроенную проверку подлинности Windows (требуется перезагрузка)».
- Веб-сайт ДОЛЖЕН быть признан клиентом сайтом локальной интрасети (не зоны Интернета). Я не видел никакой документации, объясняющей почему, но я никогда не мог заставить это работать иначе. При необходимости добавьте это в список сайтов локальной интрасети.
- Учетная запись клиента не должна быть помечена как «Чувствительная, не делегировать» в MMC «Пользователи и компьютеры AD».
Все хорошо работает при использовании wsHTTPBinding. Однако, чтобы заставить JSON работать, я должен использовать WebHttpBinding.
Затем мне нужно получить учетные данные пользователя, чтобы я мог использовать олицетворение для общения с внутренними службами.
Моя привязка в конфигурации WFC выглядит следующим образом:
Я использовал http://underground.infovark.com/2008/03/21/wcf-webhttp-binding-and-authentication/
в помощь:
<webHttpBinding>
<binding name="AjaxBinding">
<security mode="None">
<transport clientCredentialType="Ntlm" />
</security>
</binding>
</webHttpBinding>
<endpoint name="DataJson" address="Datajson" binding="webHttpBinding"
bindingConfiguration="AjaxBinding"
behaviorConfiguration="jsonbehaviour" contract="MyContract"/>
<behavior name="jsonbehaviour">
<!--<webHttp/>-->
<enableWebScript/>
</behavior>
Он успешно вызывает службу WCF, но я не могу получить ничего от: HttpContext.Current.User.Identity
или ServiceSecurityContext.Current.WindowsIdentity
, кроме анонимного, поэтому я не могу сделать:
WindowsIdentity identity = (WindowsIdentity)HttpContext.Current.User.Identity();
using (identity.Impersonate())
{
// ... code to call application B goes here ...
}
Я попытался добавить это в web.config в случае нескольких идентификаторов, о которых я читал:
<deny users="?"/>
Есть идеи у кого-нибудь?