Ошибка активации в веб-сервисе WCF с использованием basicHttpBinding, Windpws-Authentication & impersonation - PullRequest
0 голосов
/ 13 июля 2011

Я пытаюсь разместить веб-службу WCF в IIS с использованием проверки подлинности Windows. Из-за ограничений мы должны использовать basicHttpBinding и использовать олицетворение (олицетворять личность звонящего для доступа к ресурсам по цепочке).

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

 [OperationBehavior(Impersonation = ImpersonationOption.Required)]

Мой web.config:

    <system.serviceModel>
      <behaviors>
        <serviceBehaviors>
          <behavior>
            <serviceMetadata httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="true"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <bindings>
        <basicHttpBinding>        
          <binding name="basic">          
            <security mode="TransportCredentialOnly">
              <transport clientCredentialType="Windows">              
              </transport>            
            </security>          
          </binding>
        </basicHttpBinding>
      </bindings>
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      <services>
        <service name="NotesService">
          <endpoint address="http://Client1.osp.local:15000/NotesService/NotesService.svc" bindingConfiguration="basic" binding="basicHttpBinding"  contract="NotesService.ServiceContract.INotesService">
            <identity>
              <servicePrincipalName value="HTTP/Client1.osp.local:15000"/>            
            </identity>          
          </endpoint>        
        </service>
      </services>
    </system.serviceModel>

Однако я получаю ошибку активации. Чего мне не хватает?

Я получаю ошибку:

The contract operation 'Process' requires Windows identity for automatic 
impersonation. A Windows identity that represents the caller is not provided by 
binding ('BasicHttpBinding','http://tempuri.org/') for contract 
('NotesService','http://tempuri.org/'.

1 Ответ

2 голосов
/ 14 июля 2011

Если вы используете WCF 4.0, то, я думаю, вы видите артефакт функции WCF 4, называемой конечными точками по умолчанию.

В названии службы необходимо указать полное имя службы (включая пространство имен). Если предположить, что NotesService находится в пространстве имен, то при создании ServiceHost он не находит соответствия в файле конфигурации. Если вы предоставите базовый адрес HTTP в конструкторе ServiceHost, он соединит basicHttpBinding со своей конфигурацией по умолчанию (без аутентификации), что приведет к ошибке, которую вы видите

...