Есть ли способ передать учетные данные домена из исходного браузера в службе wcf webHttpBinding?

Есть ли способ передать учетные данные домена из исходного браузера в службе WCF webHttpBinding? Я думаю, что это должно быть возможно, поскольку, когда я захожу на любую страницу aspx с включенной аутентификацией Windows в IIS, я могу получить учетные данные домена вызывающего пользователя. Как мне настроить службу WCF таким образом? В настоящее время идентификатор пользователя, который я получаю в службе WCF, относится к пулу приложений, в котором работает svc?

ИЗМЕНИТЬ

У меня нет .NET 4 -- Мой файл конфигурации ниже, но я все еще получаю сообщение об ошибке:

Параметры безопасности для этой службы требуют «анонимной» аутентификации, но она не включена для приложения IIS, в котором размещена эта служба.

Должен ли я явно включать Anonymous для этого пути в IIS? Я думаю, что это сведет на нет все мои попытки получить доменное имя.

<behaviors>
<endpointBehaviors>
    <behavior name="Awesome.Project.OperationsBehavior">
        <enableWebScript />
    </behavior>
</endpointBehaviors>
</serviceBehaviors>
    <behavior name="Awesome.Project.OperationsServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
</serviceBehaviors>
</behaviors>

<services>
      <service behaviorConfiguration="Awesome.Project.OperationsServiceBehavior"
        name="Awesome.Project.Operations">
        <endpoint address="" binding="webHttpBinding" 
         contract="Awesome.Project.Operations" 
         behaviorConfiguration="Awesome.Project.OperationsBehavior" 
         bindingName="windowsSecurityWebHttpBinding">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <!--<endpoint address="mex" binding="mexHttpBinding" 
             contract="IMetadataExchange" />-->
      </service>
</services>

<bindings>
    <webHttpBinding>
        <binding name="windowsSecurityWebHttpBinding">
            <security mode="Transport">
                <transport clientCredentialType="Windows"/>
            </security>
        </binding>
    </webHttpBinding>
</bindings>

person Matt    schedule 21.07.2011    source источник
comment
Кто звонит в службу - браузер или aspx-страница?   -  person Richard Blewett    schedule 21.07.2011
comment
Это будет происходить из браузера.   -  person Matt    schedule 21.07.2011
comment
измените bindingName на bindingConfiguration в вашей конечной точке   -  person Richard Blewett    schedule 21.07.2011
comment
Обновлен мой ответ, чтобы также показать версию 3.5   -  person Richard Blewett    schedule 21.07.2011


Ответы (2)


Вам нужно включить аутентификацию в службе - при условии, что .NET 4 добавьте следующее в вашу конфигурацию

<bindings>
  <webHttpBinding>
    <binding>
      <security mode="Transport">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>
  </webHttpBinding>
</bindings>

для .NET 3.5 или 3.0 нужно

<bindings>
  <webHttpBinding>
    <binding name="webBindingConfig">
      <security mode="Transport">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>
  </webHttpBinding>
</bindings>

<services>
  <service ...>
    <endpoint bindingConfiguration = "webBindingConfig" binding="webHttpBinding" .../>
  </service>
</services>

Изменить дополнительные вопросы:

WCF, как правило, не передает учетные данные через незащищенные транспорты, поэтому важен режим mode="Transport". Если вы избавились от него, это то же самое, что и Mode="None" для WebHttpBinding.

Если считается, что сайт находится в зоне интрасети, IE автоматически передаст учетные данные пользователя. Однако браузеры, отличные от IE, не будут и поэтому будут анонимно заходить на сайт, прежде чем получить 401, а затем отправить учетные данные. Первоначальный запрос требует поддержки анонимного доступа в IIS, поскольку WCF обрабатывает механизм аутентификации.

Если вам нужно заполучить HttpContext, вы можете использовать Совместимость с Asp.NET . Однако в WCF вы можете использовать ServiceSecurityContext.Current.PrimaryIdentity.Name для получения аутентифицированного пользователя.

person Richard Blewett    schedule 21.07.2011
comment
Не должен ли он также установить атрибут поведения олицетворения либо для конкретных операций, либо для службы в целом? - person Tim; 21.07.2011
comment
если он хочет видеть удостоверение клиента в службе, а браузер вызывает службу, то это все, что ему нужно сделать - если он хочет использовать удостоверение клиента или код aspx вызывает службу, тогда Да, ты прав - person Richard Blewett; 21.07.2011
comment
Ах хорошо. Сначала не уловил этого нюанса. Спасибо :) - person Tim; 21.07.2011
comment
Обновлено описание моими стараниями; все еще икает - может быть, это не поддерживается до .NET 4? - person Matt; 21.07.2011
comment
Спасибо! Я внес ваши изменения. Мне пришлось избавиться от mode='transport', чтобы он работал через старый добрый http вместо https. К сожалению, я все еще не могу получить текущего пользователя с помощью HTTPContext. - person Matt; 21.07.2011
comment
Кроме того, когда мне запрашивают учетные данные в браузере, отличном от IE, я получаю сообщение «Настройки безопасности для этой службы требуют «анонимной» аутентификации, но она не включена для приложения IIS, в котором размещена эта служба». - person Matt; 21.07.2011

Как: олицетворение исходного вызывающего объекта при вызове WCF из веб-приложения дает пошаговое руководство о том, как это сделать.

person Tim    schedule 21.07.2011