Настройка политики доступа к службе WCF

385
24 июня 2017, 10:01

У меня есть веб приложение MVC в него встроен wcf сервис. При отладке и разработке никаких проблем с ним не возникало, а как только я развернул приложение на удаленном сервере у меня не получается присоедениться к сервису. Происходит ошибка: "Клиенту не удалось завершить согласование безопасности в течение заданного периода ожидания (00:00:00). Текущим сегментом согласования является 1 (00:00:00)..

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

Клиент:

var callback = new VWCallBackClientDebug();
        callback.LookArived += Callback_LookArived;
        callback.CallbackArrived += Callback_CallbackArrived;
        callback.LooksArived += Callback_LooksArived;
        EndpointAddress endpoint = new EndpointAddress("http://x.x.x.x/Models/WcfService/Service1.svc");
        client = new VWServiceClient(new InstanceContext(callback), "WSDualHttpBinding_IVWService", endpoint);
        client.ClientCredentials.UserName.UserName = "login";
        client.ClientCredentials.UserName.Password = "password";
        client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
        client.Subscribe();
        client.GetLooks();
        Timer.Start();
        timer_callback(Timer, null);

Конфигурация клиента:

<system.serviceModel>
    <bindings>
        <wsDualHttpBinding>
            <binding name="WSDualHttpBinding_IVWService"
                     >
                <security>
                    <message clientCredentialType="UserName" />
                </security>
            </binding>
        </wsDualHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://х.х.х.х/Models/WcfService/Service1.svc"
            binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IVWService"
            contract="VWService.IVWService" name="WSDualHttpBinding_IVWService">
            <identity>
                <dns value="х.х.х.х" />
            </identity>
        </endpoint>
    </client>
  <behaviors>
    <endpointBehaviors>
      <behavior name="behaviour">
        <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>

Сертификаты использую самоподписанные, стоят и на сервере, и на клиенте.

Конфигурация серверной стороны следующая:

<system.serviceModel>
<services>
  <service name="AppolloAdmin.Models.WcfService.Service1" behaviorConfiguration="Behavior1">
    <host>
      <baseAddresses>
        <add baseAddress="http://х.х.х.х" />
      </baseAddresses>
    </host>
    <!-- Service Endpoints -->
    <!-- Если адрес не задан полностью, он является относительным к вышеуказанному базовому адресу -->
    <endpoint address="" binding="wsDualHttpBinding" contract="AppolloAdmin.Models.WcfService.IVWService" bindingConfiguration="Binding1" behaviorConfiguration="Behavior2">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <!-- Metadata Endpoints -->
    <!-- Служба использует конечную точку Metadata Exchange для предоставления своего описания клиентам. -->
    <!-- Эта конечная точка не использует безопасную привязку и должна быть защищена или удалена перед развертыванием -->
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="Behavior2">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="Behavior1">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceCredentials>
        <serviceCertificate findValue="х.х.х.х" x509FindType="FindBySubjectName" />
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="AppolloAdmin.Models.WcfService.ClientAuthentification, AppolloAdmin" />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <wsDualHttpBinding>
    <binding name="Binding1" maxBufferPoolSize="2147483647"
    maxReceivedMessageSize="2147483647">
      <security mode="Message">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </wsDualHttpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
</serviceHostingEnvironment>

Ну и если это необходимо то вот так сервис запускается в MVC приложении

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        //routes.IgnoreRoute("{resource}.svc/{*pathInfo}");
        //routes.IgnoreRoute("{resource}.svc");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(Service1)));
    }

P.S. При запуске MVC приложение через студию возникает предупреждение, я предполагаю, что в этом может быть зарыта проблема, но ничего конкретного я в интернете не нашел.

Нашел еще похожую проблему http://www.cyberforum.ru/web-services-wcf/thread1023169.html , но там ее не решили

READ ALSO
C# Нужна помощь с ускорением кода

C# Нужна помощь с ускорением кода

Использую Syncfusion GridControl в качестве таблицы

265
C# заполнение &lt;input&gt; html

C# заполнение <input> html

Здравствуйте!

278
Работа с WebBrowser замена HTML [требует правки]

Работа с WebBrowser замена HTML [требует правки]

Доброго времени сутокПодскажите, можно ли каким то образом, изменить HTML/CSS код страницы, к которой мы подключаемся? Чтобы например тот же yandex

224
Как вставить html строку в doc файл через Interop Office?

Как вставить html строку в doc файл через Interop Office?

У меня есть html строка, например:

281