Схемы аутентификации WCF не соответствуют? - PullRequest
1 голос
/ 09 сентября 2011

Я использую .Net 3.5 и пытаюсь настроить службу WCF и получаю исключение, HTTP-запрос не авторизован с использованием схемы аутентификации клиента «Согласование».Заголовок аутентификации, полученный от сервера, был 'Negotiate, NTLM'. Я вложил свои файлы .config на стороне сервера и на стороне клиента ниже.
Просто пара замечаний.Приложение и служба используют олицетворение из-за требований доступа к сети.Веб-приложение находится на другом сервере, чем служба WCF.Для обоих файлов в файлах web.config указано следующее:

<authentication mode="Windows"/>
<identity impersonate="true" userName="userName" password="password"/>

Веб-приложение (на сервере1)

<system.serviceModel>
 <bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IReports" closeTimeout="00:01:00"
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
     useDefaultWebProxy="false" proxyAddress="http://server2/Services/ReportService">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
       maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint name="BasicHttpBinding_IReports" address="http://server2/Services/ReportService/Reports.svc"
   binding="basicHttpBinding" contract="WCFServiceRef.IReports" bindingConfiguration="BasicHttpBinding_IReports"
            behaviorConfiguration="ClientBehavior"/>
</client>
<behaviors>
  <endpointBehaviors>
    <behavior name="ClientBehavior" >
      <clientCredentials supportInteractive="true" >
        <windows allowedImpersonationLevel="Impersonation" allowNtlm="true" />
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>
</system.serviceModel>

Служба WCF (на сервере2)

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<bindings>
  <basicHttpBinding>
    <binding name="default" maxReceivedMessageSize="200000">
      <readerQuotas maxStringContentLength="200000" maxArrayLength="200000"/>
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="ReportService.ReportsBehavior" name="ReportService.Reports">
    <endpoint address="" binding="basicHttpBinding" contract="ReportService.IReports" bindingConfiguration="default">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint name="mex" address="mex" binding="basicHttpBinding" contract="IMetadataExchange" bindingConfiguration="default"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ReportService.ReportsBehavior">
      <serviceAuthorization impersonateCallerForAllOperations="false"/>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>

Я думал, что если бы я применил директиву allowNtlm="true" в приложении, это было бы исправлено.Мне кажется, что сервер ожидает проверки подлинности Windows, но не получает ее?Нужно ли использовать значения прокси из-за того, что приложение и служба находятся на разных серверах?Я чувствую, что не понимаю чего-то базового, но не знаю, находится ли это в конфигурации IIS на стороне сервера или просто в моем приложении.Спасибо за любую помощь!

1 Ответ

1 голос
/ 10 сентября 2011

Этот пример из MSDN для basicHttpBinding с TransportCredentialOnly показывает, как его настроить.Ваша конфигурация очень похожа за исключением того, что она также устанавливает уровень безопасности сообщений.Я бы попытался удалить элемент сообщения из конфигурации, чтобы увидеть, является ли это причиной проблемы.

Я не верю, что проблема заключается в передаче самих учетных данных олицетворения, но в конфигурации TransportCredentialOnly.Также убедитесь, что IIS настроен для поддержки проверки подлинности Windows на сервере WCF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...