Как настроить сервисную ссылку для указания на Https с настройкой MutualSSL? - PullRequest
0 голосов
/ 09 июля 2019

В моем проекте я недавно изменил свой сервис WCF на Https. Он настроен на взаимную настройку ssl, и сертификаты клиента и сервера установлены соответствующим образом. Серверная сторона выглядит нормально и даже нормально запускается в браузере, как показано ниже. WCF_Https

Однако при попытке настроить ссылку на службу со стороны клиента WPF (прокси-сервер службы, который был ранее добавлен и сгенерирован). Я получаю код ошибки 403, как показано ниже. Есть идеи почему?

enter image description here

Вот мои конфигурации.

Конфигурация на стороне сервера WCF

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceCredentials>
            <serviceCertificate storeLocation="LocalMachine" x509FindType="FindByIssuerName" findValue="QuickFire Root Authority" />
          </serviceCredentials>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="PushNotification_SignalR_PoC.WCF.PushNotificationService">
        <endpoint binding="wsHttpBinding" bindingConfiguration="MutualSslLargeMessageBinding" contract="PushNotification_SignalR_PoC.WCF.IPushNotificationService" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="MutualSslLargeMessageBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="Transport">
            <transport clientCredentialType="Certificate"></transport>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="true" />
  </system.webServer>
</configuration>

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

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WsHttpBinding_IPushNotificationService"
                 closeTimeout="00:01:00" openTimeout="00:01:00"
                 receiveTimeout="00:30:00" sendTimeout="00:01:00"
                 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                 maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
                 messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
                        maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="Transport">
            <transport clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <client>
      <endpoint address="https://localhost:44367/PushNotificationService.svc"
          binding="wsHttpBinding" bindingConfiguration="WsHttpBinding_IPushNotificationService"
          contract="ServiceProxy.IPushNotificationService" name="WsHttpBinding_IPushNotificationService" />
    </client>

    <behaviors>
      <endpointBehaviors>
        <behavior name="MutualSslBehavior">
          <clientCredentials>
            <clientCertificate storeLocation="CurrentUser" x509FindType="FindBySubjectName" findValue="QuickFire Test Client"/>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

1 Ответ

0 голосов
/ 09 июля 2019

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

<services>
      <service name="PushNotification_SignalR_PoC.WCF.PushNotificationService">
        <endpoint binding="wsHttpBinding" bindingConfiguration="MutualSslLargeMessageBinding" contract="PushNotification_SignalR_PoC.WCF.IPushNotificationService" />
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"></endpoint>
      </service>
</services>

Подробнее
https://docs.microsoft.com/en-us/dotnet/framework/wcf/extending/how-to-configure-a-custom-ws-metadata-exchange-binding
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

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