Согласование безопасности WCF SOAP после изменения сертификата - PullRequest
0 голосов
/ 12 декабря 2018

После того, как я изменил самозаверяющий сертификат "localhost" (DNS = localhost) на "Сертификат источника Cloudflare" (dns = mydomain.com), я получаю следующую ошибку:

SOAP security negotiation with 'http://localhost:8000/MyService.svc' for target 'http://localhost:8000/MyService.svc' failed. See inner exception for more details.

Внутреннее исключение:

Either the client credential was invalid or there was an error collecting the client credentials by the SSPI.

Я заметил, что после запуска клиента у меня появляется окно для ввода учетных данных.Не знаю почему.

Что я сделал точно:

  1. Сгенерированный запрос сертификата в IIS
  2. Завершенный сертификат на CloudFlare
  3. Полученный ключ вставлен в текстовый файлс CloudFlare Root CA
  4. Завершенный сертификат в IIS (Personal, LocalMachine)
  5. В MMC добавлен в доверенные издатели CloudFlare Root CA (LocalMachine)
  6. Для веб-сайта WCF изменен сертификат SSL наCloudFlare
  7. Изменено значение клиента с "localhost" на "mydomain.com"
  8. Изменено значение сервера с "localhost" на "mydomain.com"
  9. Изменено findValue для

WCF web.config

<system.serviceModel>
    <client />
    <behaviors>
      <serviceBehaviors>
        <behavior name="authBehavior">
          <serviceAuthorization principalPermissionMode="UseWindowsGroups">
            <authorizationPolicies>
              <add policyType="WCF.Common.AuthorizationPolicy, WCF" />
            </authorizationPolicies>
          </serviceAuthorization>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCF.Common.IdentityValidator, WCF" />
            <serviceCertificate findValue="CloudFlare Origin Certificate" storeLocation="LocalMachine" x509FindType="FindBySubjectName" storeName="My" />
          </serviceCredentials>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name="svcBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpsBinding>
        <binding name="basicHttpsEndpointBinding" maxReceivedMessageSize="1073741824" maxBufferSize="1073741824" maxBufferPoolSize="1073741824">
          <readerQuotas maxDepth="32" maxArrayLength="1073741824" maxStringContentLength="1073741824" />
          <security mode="Transport">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpsBinding>
      <wsHttpBinding>
        <binding name="wsHttpEndpointBinding"></binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="WCF.MyService" behaviorConfiguration="svcBehavior">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" contract="WCF.IMyService">
          <identity>
            <dns value="mydomain.com" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Client app.config

<system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="MessageAndUserName">
                    <security mode="Message">
                        <message clientCredentialType="UserName" />
                    </security>
                </binding>
                <binding name="WSHttpBinding_IMyService" />
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8777/MyService.svc"
                binding="wsHttpBinding" contract="WCF.IMyService"
                name="WSHttpBinding_IMyService">
                <identity>
                    <dns value="mydomain.com" />
                </identity>
            </endpoint>
        </client>

      <behaviors>  
        <serviceBehaviors>  
          <behavior name="DefaultServiceBehavior">  
            <serviceMetadata httpGetEnabled="true" />  
            <serviceDebug includeExceptionDetailInFaults="true" />  
          </behavior>  
        </serviceBehaviors>  
      </behaviors>  
    </system.serviceModel>

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

Я использую wsHttpBindings между WCF и Клиентом.Что я могу сделать, чтобы избавиться от этой ошибки?

Какова цель использования wsHttpBinding и т. Д. ... Разрешить только этому клиенту общаться с MyService ... больше никому не разрешено.Клиентское приложение будет работать на нескольких компьютерах в домене.Вы предлагаете использовать другой подход?

Спасибо за любую идею!

РЕДАКТИРОВАТЬ: компьютер с ошибкой не работает в домене.Ни один из них не работает для компьютера в домене: /

EDIT2: Привязка транспорта WCF web.config в режиме безопасности:

<wsHttpBinding>
        <binding name="wsHttpEndpointBinding">
          <security mode="Transport">
            <message clientCredentialType="None" />
          </security>
        </binding>
      </wsHttpBinding>

Привязки конфигурации на стороне клиента:

<bindings>
            <wsHttpBinding>
              <binding name="WSHttpBinding_IMyService">
                <security mode="Transport">
                  <message clientCredentialType="None" />
                </security>
              </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://localhost:8001/MyService.svc"
                binding="wsHttpBinding" contract="WCF.IMyService"
                name="WSHttpBinding_IMyService">
                <identity>
                    <dns value="mydomain.com" />
                </identity>
            </endpoint>
        </client>

IIS:Certificate

1 Ответ

0 голосов
/ 14 декабря 2018

Вот несколько ресурсов, чтобы просмотреть, чтобы определить, будет ли NetTcpBinding работать для вас, похоже, что это так, поскольку вы используете веб-сервис для внутреннего использования.

NetTcpBinding netTcpBinding лучше всего подходит, когдаСлужба WCF и ее клиенты находятся в интранет-инфраструктуре.Так как он поддерживает только протокол TCP, а не HTTP, доступ к сервису через Интернет невозможен.

Это безопасное связывание используется для отправки сообщений SOAP с двоичным кодом в компьютерах интрасети.Он поддерживает надежность, транзакции и безопасность.Если вы используете netTcpBinding и размещаете службу WCF в IIS, вам необходимо выполнить некоторые настройки в системе, а IIS , эта статья поможет вам с необходимыми настройками.

Несколько советов по устранению неполадок, связанных с проблемами:

  • Двойной щелчок по сертификату в MMC дает ли он какие-либо сообщения об ошибках в заголовке информации сертификата?
  • Можете ли вы просматривать службу с вашего клиента в браузере?
  • Назначен ли сертификат в IIS
  • Есть ли у вас правильная привязка
  • Использует ли клиент ту же привязку, что и хост службы?
  • Ваша конечная точкассылка на правильное связывание и поведение службы

Дополнительная полезная информация о NetTcpBinding:

https://stackoverflow.com/a/3375161/2016162

...