2015-03-24 7 views
1

Я разработал службу WCF, которая работает в IIS (точнее, IIS 7.5). Эта служба работает под собственным пулом приложений под определенным идентификатором домена. Эта ссылка на службы & вызывает другие службы WCF, размещенные в другом месте в сети, которые, в свою очередь, обращаются к различным ресурсам (журнал событий, серверы SQL и т. Д.).Делегирование учетной записи пула приложений IIS на вызовы службы WCF

Звонки на мою услугу проходят аутентификацию с использованием имени пользователя & с помощью пароля UserNamePasswordValidator. Используемые имена пользователей: не учетные данные домена.

Что я пытаюсь сделать, так это то, что когда моя служба называется &, она, в свою очередь, вызывает службы, на которые ссылаются, с использованием сгенерированных прокси-классов, что она делегирует идентификатор пула приложений как вызывающий идентификатор, поскольку эта учетная запись домена имеет были предоставлены права доступа к фоновым ресурсам, таким как SQL Server.

Моя текущая реализация выглядит следующим образом:

конфигурации службы

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="RemoteServiceBinding" closeTimeout="00:10:00" 
      openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
      maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" /> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
     <wsHttpBinding> 
     <binding name="MyServiceBinding" closeTimeout="00:10:00" openTimeout="00:10:00" 
      receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" /> 
      <security mode="Message"> 
      <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://remote.service.address/Service.svc" 
     binding="basicHttpBinding" bindingConfiguration="RemoteServiceBinding" 
     contract="RemoteService.IRemoteService" name="RemoteServiceBinding" /> 
    </client> 
    <services> 
     <service name="MyService.MyService" behaviorConfiguration="MyServiceBehavior"> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyServiceBinding" contract="MyService.IMyService"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8733/MyService/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
      <serviceCredentials> 
      <clientCertificate> 
       <authentication certificateValidationMode="None" /> 
      </clientCertificate> 
      <serviceCertificate findValue="AuthCert" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" /> 
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyService.CredentialValidator, MyService" /> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Код сервиса поведение

using (var client = new Proxy.RemoteServiceClient()) { 
    client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation; 

    return client.PerformAction(); 
} 

Используя этот код, когда клиент делает вызов к моему услуга, бросается следующее:

The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Negotiate,NTLM'. 

Не могли бы вы помочь мне или указать мне в правильном направлении, как реализовать эту конфигурацию аутентификации?

ответ

0

Мне удалось найти рабочее решение. Он реализован как таковой:

клиент прокси полномочия должны быть установлены на те из пула приложений IIS, так как они не получают подобрал автоматически:

client.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials; 

Кроме того, удаленный сервис я подключение к которому имело принципал обслуживания, который должен был быть включен в конфигурацию конечной точки. Таким образом, я изменил конфиг, который был создан с помощью инструментов VS к следующему:

<client> 
    <endpoint address="http://remote.service.address/Service.svc" 
    binding="basicHttpBinding" bindingConfiguration="RemoteServiceBinding" 
    contract="RemoteService.IRemoteService" name="RemoteServiceBinding"> 
    <identity> 
     <servicePrincipalName value="spn_name" /> 
    </identity> 
    </endpoint> 
</client> 

С помощью этой конфигурации, я был в состоянии проверить подлинность моей службы по имени пользователя & пароль, то у меня есть доступ к услуге Экземпляр SQL Server с помощью учетные данные домена, на которые запущен пул приложений в IIS.