«Идентификатор Windows, который представляет вызывающего, не предоставляется привязкой», пытаясь выдать себя за пользователя Windows в WCF - PullRequest
0 голосов
/ 17 января 2012

У меня есть служба WCF, украшенная:

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]

Я хотел бы настроить в Web.Config учетные данные пользователя, которые будут использоваться для олицетворения во время вызова службы.Пользователь - пользователь домена Windows (учетные данные: домен \ имя пользователя и пароль). Вот моя конфигурация:

<behaviors>
  <serviceBehaviors>
    <behavior name="MetadataBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <serviceAuthorization impersonateCallerForAllOperations="true" /> 
    </behavior>
  </serviceBehaviors>
</behaviors>
 <bindings>
  <basicHttpBinding>
    <binding name="httpBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="MetadataBehavior" name="<serviceName>">
    <endpoint address="/" binding="basicHttpBinding" contract="<service contract>" bindingConfiguration="httpBinding"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <add baseAddress="<service url>"/>
      </baseAddresses>
    </host>
  </service>
</services>

Я получаю сообщение об ошибке:

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

Это ожидается, поскольку учетные данные пользователя нигде не указаны. Вопрос: Где я должен разместить учетные данные? Размещение их в system.web / identity не работает. Я думаю, что WCF необходимо настроить их отдельно. Где?

Ответы [ 2 ]

1 голос
/ 17 января 2012

Другой способ получить идентификатор Windows текущего абонента, подобный этому:

var identity = ServiceSecurityContext.Current.WindowsIdentity;

Кроме того, согласно этой странице MSDN , для вашей привязки BasicHttpSecurityMode должно быть установлено TransportWithMessageCredential

0 голосов
/ 18 января 2012

В конце концов кажется, что олицетворение выполнения метода WCF может быть выполнено, только если включена совместимость ASPNET:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

После включения режима совместимости стандартное олицетворение из system.web / identity работает:

  <system.web>
        <authorization>
            <allow users="?"/>
        </authorization>
        <authentication mode="Windows"/>
        <identity impersonate="true" userName="mydomain\myuser" password="mypass"/>
  </system.web>

Это решение не подходит для более сложных привязок и требует, чтобы класс реализации WCF был украшен

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

Так что это не подходит для каждого случая, но для меня это было приемлемо.

...