.Net Core 2.0 вызов конфигурации клиента WCF - PullRequest
0 голосов
/ 13 марта 2019

У меня есть приложение .NET Core 2.0, и мне нужно вызвать клиент WCF с одного из его контроллеров и передать учетные данные пользователя для аутентификации.

В основном приложении .net я создал ссылку для клиента WCF с помощью Connected Services (поставщик ссылок на веб-службы WCF) и теперь в процессе настройки вызова.Обратите внимание, что я могу без проблем использовать одну и ту же конечную точку в приложении 4.6.

Вот мой код:

        var binding = new BasicHttpBinding {Security = {Mode = BasicHttpSecurityMode.Transport}};

        var address = new EndpointAddress("https://my-endpoint.asmx");

        var client  = new MyAppSoapClient(binding, address);

        var credentials = CredentialCache.DefaultNetworkCredentials; 

        client.ClientCredentials.Windows.ClientCredential = credentials;
        client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

        var response = client.GetStuff("param").Result;

Я столкнулся с рядом проблем:

Это должен быть вызов https
Мне нужно пройти текущий вход в системуучетные данные пользователя для вызова

Текущая ошибка, которую я получаю, выглядит следующим образом:

The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Negotiate, NTLM'

Кроме того, ConnectedService.json (автоматически созданный поставщиком ссылок на веб-службы WCF) имеет предопределенную конечную точку Uri.Я не понимаю, почему мне нужно передавать адрес клиенту вручную (кажется, код заставляет меня это делать) ... в идеале я хотел бы, чтобы это динамически исправлялось в json в зависимости от среды.

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Я заметил, что вы передали текущего вошедшего в систему пользователя как учетные данные Windows (что также необходимо для включения олицетворения), но вы явно не задали учетные данные клиента для безопасности транспортного уровня.

BasicHttpBinding binding = new BasicHttpBinding();
            binding.Security.Mode = BasicHttpSecurityMode.Transport;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

Также ConnectedService.json (созданный автоматически WCF Web). Service Reference Provider) имеет предопределенную конечную точку Uri .. Я не понять, почему мне нужно передать адрес клиенту вручную ( код, кажется, заставляет меня сделать это)

Вы можете изменить метод автоматической генерации прокси-клиента для создания клиентского прокси-класса (находится в reference.cs)
Изменить привязку безопасности

private static System.ServiceModel.Channels.Binding GetBindingForEndpoint(EndpointConfiguration endpointConfiguration)
        {
            if ((endpointConfiguration == EndpointConfiguration.WebService1Soap))
            {
                System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
                result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
                result.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Windows;
                result.MaxBufferSize = int.MaxValue;
                result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
                result.MaxReceivedMessageSize = int.MaxValue;
                result.AllowCookies = true;
                return result;
            }

Изменить конечную точку.

  private static System.ServiceModel.EndpointAddress GetEndpointAddress(EndpointConfiguration endpointConfiguration)
    {
        if ((endpointConfiguration == EndpointConfiguration.WebService1Soap))
        {
            return new System.ServiceModel.EndpointAddress("http://10.157.13.69:8001/webservice1.asmx");

Создание прокси-класса клиента.

ServiceReference1.WebService1SoapClient client = new WebService1SoapClient(WebService1SoapClient.EndpointConfiguration.WebService1Soap);
            client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
            client.ClientCredentials.Windows.ClientCredential.UserName = "administrator";
            client.ClientCredentials.Windows.ClientCredential.Password = "123456";

Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

0 голосов
/ 14 марта 2019

В моей привязке отсутствовал тип учетных данных безопасности Ntlm (см. Ниже).

Проблема решена.

    var binding = new BasicHttpBinding {Security = {Mode = BasicHttpSecurityMode.Transport,
        Transport = new HttpTransportSecurity(){ClientCredentialType = HttpClientCredentialType.Ntlm } }};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...