WCF Олицетворение через конфигурацию - PullRequest
4 голосов
/ 01 июля 2011

У меня есть простая служба WCF, которая использует WSHttpBinding и проверку подлинности Windows.Я пытаюсь заставить сервер олицетворять личность клиента при каждом вызове метода для этой службы.

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

Для операции контракта GetAdvice требуется идентификатор Windows для автоматической олицетворения.Идентификатор Windows, который представляет вызывающего, не предоставляется связыванием ('WSHttpBinding', 'http://tempuri.org/') для контракта (' IMagicEightBallService ',' http://tempuri.org/'.

Любые идеи о том, что эта ошибкапытаетесь мне сказать?

Все решение можно просмотреть по адресу ftp: //petio.org/2011/07/01/MagicEightBall/ (или загрузить по адресу http://petio.org/2011/07/01/MagicEightBall.zip).Я просто публикую проект в локальной папке IIS и обращаюсь к службе по адресу http://localhost/MagicEightBall/MagicEightBallService.svc.

Спасибо!

ОБНОВЛЕНИЕ:

Web.config моей службы:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>

    <services>
      <service name="Petio.MagicEightBall.MagicEightBallService" behaviorConfiguration="MagicEightBallServiceBehavior">

        <endpoint name="WSHttpBinding_WindowsSecurity_IMagicEightBallService"
                  address="http://localhost/MagicEightBall/MagicEightBallService.svc"
                  binding="wsHttpBinding"
                  contract="Petio.MagicEightBall.IMagicEightBallService" />

        <endpoint address="mex"
                  binding="mexHttpsBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="MagicEightBallServiceBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceAuthorization impersonateCallerForAllOperations="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>
</configuration>

Мой сервисный код:

public class MagicEightBallService : IMagicEightBallService
{
    [OperationBehavior(Impersonation=ImpersonationOption.Required)]
    public string GetAdvice()
    {
        MagicEightBall ball = new MagicEightBall();
        return ball.GetAdvice();
    }
}

1 Ответ

4 голосов
/ 02 июля 2011

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

Я проверил ваши настройки вашего проекта и ваш клиентский код и вижу две проблемы с блокировкой:

  • Если вы хотитеДля принудительной олицетворения из конфигурации вы должны использовать только привязки с аутентификацией Windows - ваша конечная точка, открытая через HTTPS, не имеет аутентификации.
  • Олицетворение в WCF также требует, чтобы клиент позволял службе олицетворять свою личность, поэтому настройка конфигурации для службы недостаточно.

Здесь у вас есть статья об олицетворении и всех необходимых / возможных настройках.

...