Есть ли способ передать учетные данные домена из исходного браузера в wcf-сервисе webHttpBinding? - PullRequest
2 голосов
/ 21 июля 2011

Есть ли способ передать учетные данные домена из исходного браузера в службу webHttpBinding WCF? Я думаю, это должно быть возможно, так как когда я захожу на любую страницу 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>

Ответы [ 2 ]

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

Вам необходимо включить аутентификацию в сервисе - при условии, что .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 = "None" для WebHttpBinding

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

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

0 голосов
/ 21 июля 2011

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

...