Как настроить клиент WSDL, созданный с помощью подключенных служб, для использования базовой аутентификации? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть сторонний WSDL-сервис, который мне нужно интегрировать в веб-приложение .NET Core 2.1.

Я добавил службу через «Добавить подключенную службу»> «Поставщик ссылок на веб-службы Microsoft WCF».

У меня есть некоторый служебный класс, который настраивает службу следующим образом:

ServiceClient servicePort = new ServiceClient(); 

servicePort.ClientCredentials.UserName.UserName = USERNAME;
servicePort.ClientCredentials.UserName.Password = PASSWORD;

setupHttpHeader(servicePort.InnerChannel );

где

    public static void setupHttpHeader( IClientChannel serviceChannel )
    {
        using (new OperationContextScope( serviceChannel ))
        {
            // Add a HTTP Header to an outgoing request
            HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
            requestMessage.Headers["Authorization"] = "Basic " + System.Convert.ToBase64String(Encoding.UTF8.GetBytes(USERNAME + ":" + PASSWORD));
            OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
        }
    }

Теперь, когда я пытаюсь вызвать конечную точку в моем контроллере,Я получаю это исключение:

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'basic realm="appbox object-model"'.     

В старом образце .NET Framework 4.0 для подключения сторонней службы существовал app.config, в котором были некоторые конфигурации для привязок.Они выглядели так:

      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Basic" />
      </security> 

Что мне нужно добавить в мой проект, чтобы сделать эту работу?

1 Ответ

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

Решение было найдено в комментарии к этому вопросу .

В разделе GetBindingForEndpoint сгенерированного кода должно быть что-то вроде:

System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding(System.ServiceModel.BasicHttpSecurityMode.Transport);
result.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Basic;

В моем случае мне нужно было TransportCredentialOnly, так как конечная точка была http, а не https.

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