Не удается получить учетные данные пользователя с помощью привязки webhttp для вызовов JSON в службу WCF - PullRequest
3 голосов
/ 05 июня 2009

Надеюсь, кто-то может помочь!

Я звоню в службу WCF с использованием JSON, но не могу получить учетные данные пользователя.
Мы используем Kerberos, поэтому IIS настроен следующим образом:

Задачи на стороне сервера:

  1. IIS сервер является членом домена
  2. Установить учетную запись компьютера сервера IIS в MMC AD Users & Computers как «Доверенная для делегирования»
  3. Сервер IIS необходимо перезагрузить, чтобы эта политика вступила в силу.
  4. Для сайта / виртуального каталога должна быть выбрана только встроенная проверка подлинности Windows
  5. В IIS нельзя использовать NTLM только в качестве метода аутентификации (обычно это не проблема, NEGOTIATE используется по умолчанию, поэтому, если вы специально не запустили скрипт для его изменения, не беспокойтесь об этом).
  6. Имя сервера IIS либо должно точно соответствовать имени учетной записи в AD, либо инструмент SetSPN следует использовать в тех случаях, когда в качестве альтернативного имени установлен сайт IIS (например, сервер называется server01.domain.com, а веб-сайт называется www.application). ком).

Клиентские задачи

  1. Клиент должен использовать IE 5.x +. Если клиент работает под управлением IE 6, убедитесь, что в разделе «Инструменты»> «Свойства обозревателя»> «Дополнительно» выбрано «Включить встроенную проверку подлинности Windows (требуется перезагрузка)».
  2. Веб-сайт ДОЛЖЕН быть признан клиентом сайтом локальной интрасети (не зоны Интернета). Я не видел никакой документации, объясняющей почему, но я никогда не мог заставить это работать иначе. При необходимости добавьте это в список сайтов локальной интрасети.
  3. Учетная запись клиента не должна быть помечена как «Чувствительная, не делегировать» в 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="?"/>

Есть идеи у кого-нибудь?

1 Ответ

1 голос
/ 05 июня 2009
  • У вас есть этот раздел в вашей конфигурации?

    <system.web>
    <identity impersonate="true"/>
    
    • Под каким аккаунтом работает ваш пул приложений? (Сетевая служба не так ли?)
    • Возможно, у вас нет повторяющихся имен SPN в домене?

Это единственные вещи, которые у меня есть в моем «списке» вещей для проверки при интегрированной аутентификации, которые вы явно не упомянули в своем вопросе. Надеюсь, это поможет?

...