Невозможно установить ClientCredentials для WCF SOAP Запрос - PullRequest
0 голосов
/ 19 марта 2020

Я использую Visual Studio 2019, чтобы попытаться создать клиент. Net 4.5.2, который использует удаленную веб-службу, использующую SOAP через HTTPS. Для аутентификации сервис требует, чтобы клиентский сертификат был присоединен ко всем запросам. Клиент создает экземпляр класса System.ServiceModel.ClientBase. Кажется, независимо от того, как я генерирую клиентский класс, я не могу установить ClientCredentials, я думаю, потому что ClientCredentials доступны только для чтения.

Вот команды, которые я использовал для генерации клиентского класса:

svcutil.exe /t:metadata https://example.com?WSDL
svcutil.exe /language:cs /config:app.config /messagecontract *.xsd *.wsdl

Вот привязка, которую я использую в своем файле web.config:

<bindings>
  <basicHttpBinding>
    <binding name="TCSOnlineServicePortBinding">
      <!-- I am not sure of the mode below, message also does not work -->
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Certificate" proxyCredentialType="None" />
        <message clientCredentialType="Certificate" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="https://example.com"
      binding="basicHttpBinding" bindingConfiguration="TCSOnlineServicePortBinding"
      contract="TCSOnlineService" name="TCSOnlineServicePort" />
</client>

Вот код, который не работает:

  var TCSSvcClient = new TCSOnlineServiceClient(tcs_endpoint, TCSEndpointAddr);
  var aCert = new X509Certificate2();
  ... [omitting code to find cert in MY store]
  // The line below leave the ClientCertificate.Certificate set to NULL????? Why??
  TCSSvcClient.ClientCredentials.ClientCertificate.Certificate = aCert;
  // This also does not work, certificate is left NULL
  TCSSvcClient.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2();

Кто-нибудь может увидеть, что я делаю неправильно ? Заранее спасибо.

1 Ответ

0 голосов
/ 20 марта 2020

Нам лучше настроить сертификат с помощью LocalMachine store, а затем добавить текущего пользователя, работающего с клиентским приложением, в группу управления закрытым ключом сертификата.

ServiceReference1.TestServiceClient client = new ServiceReference1.TestServiceClient();
            client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "9ee8be61d875bd6e1108c98b590386d0a489a9ca");
            var result = client.GetResult("a");
            result = client.Test();
            Console.WriteLine(result);

enter image description here
Для сертификата клиента, сгенерированного с помощью Powershell, нам лучше ориентироваться на приложение DotNet4.6.2 или выше.
Возникла проблема предоставить сертификат клиента таким способом. Мы должны убедиться, что текущий пользователь может прочитать закрытый ключ сертификата.

  TCSSvcClient.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2();

Кроме того, аутентификация клиента с помощью сертификата требует доверительных отношений между клиентской и серверной сторонами. установили ли вы доверительные отношения перед тем, как позвонить в службу?
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/transport-security-with-certificate-authentication
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

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