Ошибка WCF только через интернет - PullRequest
1 голос
/ 07 февраля 2011

У меня проблема с WCF. Застрял здесь на несколько дней.

  • У меня служба WCF и клиент отлично работают в интрасети.
  • Я развернул ту же службу / клиент на нашем сервере IIS, доступном через Интернет. К этой услуге я могу получить доступ с моей рабочей станции, используя интернет-сайт (адрес .com)
  • Однако при доступе к тому же сайту .com с помощью компьютера, не подключенного к нашей сети, он вызывает у меня ужас: «HTTP-запрос не авторизован с помощью схемы аутентификации клиента« Согласование ». Заголовок аутентификации, полученный от сервера, был« Согласовать » , NTLM '"при доступе к услуге

Другая информация: клиент аутентифицирует меня. Когда клиент обращается к службе WCF, я получаю сообщение об ошибке.

Клиент Web.Config:

<system.serviceModel>
  <bindings>
   <basicHttpBinding>
    <binding name="BasicHttpEndpoint" closeTimeout="00:01:00" openTimeout="00:01:00"
     receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="true"
     bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
     useDefaultWebProxy="true">
     <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 address="http://exposedoutside.com:80/site/myservice.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpEndpoint"
    contract="WFLServiceReference.IWorkflow" name="BasicHttpEndpoint" />
  </client>
   <behaviors>
     <endpointBehaviors>
       <behavior name="">
         <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
         <clientCredentials>
           <windows allowedImpersonationLevel="Impersonation"/>
         </clientCredentials>
       </behavior>
     </endpointBehaviors>
   </behaviors>
 </system.serviceModel>

Мне не нужно было указывать порт. Кроме того, я добавил это в коде позади

Dim wcfService = New WCFServiceProxy.myserviceClient()
wcfService.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation

Я что-то упустил?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 17 мая 2011

Можете посмотреть, можете ли вы найти ответ на эту тему? https://stackoverflow.com/questions/6035805/digest-authentication-with-reliable-messaging

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

0 голосов
/ 07 февраля 2011

Вы не можете использовать clientCredentialType = "Windows" (согласование) через Интернет.Это работает, только если клиент и сервер находятся в одном и том же домене или доверенных доменах.Если вы действительно хотите, чтобы учетные записи Windows проходили аутентификацию через Интернет, вы должны предоставить конечной точке с параметром clientCredentialType значение Basic.Он будет использовать обычную аутентификацию, поэтому клиент должен будет явно указать имя пользователя и пароль.Имейте в виду, что предоставление такой конечной точки без защиты транспорта (HTTPS) просто недопустимо, поскольку вы будете отправлять учетные данные в вашу сеть через Интернет в виде простого текста.

0 голосов
/ 08 февраля 2011

Видимо, мне просто нужно было передать учетные данные. Я избегал этого, но похоже, что это действительно путь:

clientProxyHere.ClientCredentials.HttpDigest.ClientCredential = New System.Net.NetworkCredential("user", "password")

0 голосов
/ 07 февраля 2011

Убедитесь, что IIS настроен на анонимную аутентификацию в этом веб-приложении.Вы хотите обрабатывать аутентификацию самостоятельно, поэтому вам нужно сообщить IIS, что это разрешено всем.Это нормально, если вы уверены, что хорошо выполнили аутентификацию.

Он работает с вашего локального компьютера, так как использует для входа учетные данные домена Windows. Самый простой способ - открыть конечную точку WCF в веб-браузере (например, набрать http://exposedoutside.com:80/site/myservice.svc в адресебар)

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