Звонящий не был аутентифицирован службой - PullRequest
2 голосов
/ 11 февраля 2011

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

У меня есть собственный сервис WCF, который работает нормально, когда размещается на моей машине, и клиентна моей машине.

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

Пожалуйста, кто-то может посоветовать, гдепроблема возникает.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

С уважением

Ash

Вот клиентская конфигурация на моем компьютерекоторый работает

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="WSDualHttpBinding_IDataCollector" 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">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" />
          <security mode="Message">
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://192.168.1.74:8080/" binding="wsDualHttpBinding"
        bindingConfiguration="WSDualHttpBinding_IDataCollector" contract="AshService.IDataCollector"
        name="WSDualHttpBinding_IDataCollector">
        <identity>
          <userPrincipalName value="Ash-PC\Ash" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

Вот серверная конфигурация

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="WSDualHttpBinding_IDataCollector" 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">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" />
          <security mode="Message">
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
                algorithmSuite="Default" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <services>
      <service name="DataCollector">
        <endpoint address="http://192.168.1.74:8080" binding="wsDualHttpBinding"
          bindingConfiguration="WSDualHttpBinding_IDataCollector" contract="IDataCollector" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Ответы [ 3 ]

2 голосов
/ 12 февраля 2011

Вы правы, что ваши проблемы связаны с проверкой подлинности Windows.Как описал Rest Wing, если вы хотите использовать учетные данные AD, к которым у службы есть доступ, вам придется предоставить эти учетные данные, чтобы служба могла аутентифицировать клиента.

Если вы не можете использовать проверку подлинности Windows, и вы необходимо аутентифицировать клиента, который вам понадобится, чтобы взглянуть на другие методы аутентификации.Одним из методов является имя пользователя / пароль, но вам нужно будет установить собственные алгоритмы аутентификации.Другое это сертификаты;на сервере и клиенте должны быть установлены сертификаты (работают сертификаты X509) для идентификации друг друга.Существуют и другие методы, но, если я правильно помню, только два указанных выше будут работать с компьютерами, которые не находятся в одном домене.

Если вам не требуется аутентифицировать клиента, установите для режима безопасности значение ""Никто".Это будет техника для публично доступных услуг, доступных через Интернет.

1 голос
/ 12 февраля 2011

попробуйте

svc.ClientCredentials.Windows.ClientCredential.UserName = "username";
svc.ClientCredentials.Windows.ClientCredential.Password = "password";
1 голос
/ 11 февраля 2011

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

РЕДАКТИРОВАТЬ : учетные данные должны бытьиспользуется для аутентификации клиента на стороне сервиса.

// Provide client credentials
NetworkCredential credentials = new NetworkCredential( "UserName", "RealPasswordHere", "DomainOrMachineName" );

// Create factory that will be used to create proxy to the service
// Pass the client credentials into the factory
var factory = new ChannelFactory<AshService.IDataCollector>( "WSDualHttpBinding_IDataCollector" );
factory.Credentials.Windows.ClientCredential = credentials;

// Create and open proxy to the service
AshService.IDataCollector proxy = factory.CreateChannel();
( proxy as IChannel ).Open();

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