Ошибка аутентификации при вызове службы WCF из ASP.NET - PullRequest
6 голосов
/ 21 сентября 2011

Платформа: VS 2008, .NET 3.5, C #, Oracle 11g

Я создал службу WCF, которая принимает некоторые элементы данных, а затем вставляет их в таблицу базы данных и возвращает целое число.Я также создал небольшое веб-приложение ASP.NET для тестирования этой службы.У тестового веб-приложения есть только страница с полями и кнопкой, нажатие на которую фактически вызывает веб-сервис для вставки данных и возврата целочисленного значения.

Шаги, которые я предпринял:

  • Создание службы WCF
  • Публикация службы WCF
  • Создание прокси-класса (.cs) и app.config с использованием svcutil
  • Создание тестового приложения asp.netи добавьте прокси-класс и параметры конфигурации, сгенерированные на предыдущем шаге.
  • Разрушьте тестовое приложение

Это прекрасно работает, когда я разверну WCF и тестовое веб-приложение на моемкомпьютер - Windows XP, IIS 5.1.Но всякий раз, когда я пытаюсь развернуть их на удаленном сервере, это не работает.Когда я пытаюсь использовать службу (развернут на удаленном сервере - Windows 2003 server, IIS 6), я получаю следующую ошибку:

Запрос токена безопасности не может быть выполнен из-за проверки подлинностиошибка.

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.ServiceModel.FaultException: не удалось выполнить запрос маркера безопасности из-за сбоя аутентификации.

Ниже приводится содержимое файлов .config:

wcf-раздел Web.Config вызова веб-приложения ASP.NET (Потребитель):

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
    <binding name="WSHttpBinding_IMyWCFService" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
        allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
          enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None"
        realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
        algorithmSuite="Default" establishSecurityContext="true" />
      </security>
    </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://57.23.85.28:8001/MyWCFService/MyWCFService.svc"
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMyWCFService"
      contract="IMyWCFService" name="WSHttpBinding_IMyWCFService">
    <identity>
      <dns value="localhost" />
    </identity>
      </endpoint>
    </client>
  </system.serviceModel>

Web.Config of WCF:

<configuration>
  <connectionStrings>
    <add name="DSMyWCF" connectionString="Data Source=XXX;User id=XXX;Password=XXX;"/>
  </connectionStrings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="MyWCFService.MyWCFServiceBehavior"
        name="MyWCFService.MyWCFService">
        <endpoint address="" binding="wsHttpBinding" contract="MyWCFService.IMyWCFService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/Design_Time_Addresses/MyWCFService/MyWCFService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyWCFService.MyWCFServiceBehavior">
          <!-- To avoid disclosing metadata information,
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes,
          set the value below to true.  Set to false before deployment
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>    

1 Ответ

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

Может быть связано с настройкой безопасности службы wcf, а точнее, для типа учетных данных Windows требуется действительное имя пользователя и пароль домена.

Попробуйте предоставить следующие атрибуты на стороне клиента;

proxy.ClientCredentials.Windows.ClientCredential.UserName = "UserName ";
proxy.ClientCredentials.Windows.ClientCredential.Password = "Password ";
proxy.ClientCredentials.Windows.ClientCredential.Domain = "Domain ";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...