WCF NetCore Пропустить проверку сертификата - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь использовать API WCF с .Net Core 2.1.2, но в настоящее время у меня возникают некоторые проблемы с сертифицированными валидациями.

Основная проблема в том, что когда я отлаживаю, я могу делать запросы к серверу. Когда я развертываю исполняемый файл моего проекта и запускаю на моей машине, я могу также делать запросы. Но когда я копирую тот же исполняемый файл в среду принятия, код выдает исключение «не удалось установить доверительные отношения для безопасного канала SSL / TLS» *

Моя машина находится за пределами среды приема (я использую VPN). Приемная машина находится внутри окружающей среды.

Есть идеи о том, что происходит?

Спасибо!

private WSClient InstantiateProxy()
{
    WSClient accessWSClient = new WSClient(EndpointConfiguration.MIAccessPort, Configuration["AppConfiguration:Endpoint"]);

    accessWSClient.ClientCredentials.Windows.ClientCredential =
        new NetworkCredential(Configuration["AppConfiguration:Username"], Configuration["AppConfiguration:Password"]);

    ConfigureBinding(accessWSClient);

    accessWSClient.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication
    {
        CertificateValidationMode = X509CertificateValidationMode.None,
        RevocationMode = X509RevocationMode.NoCheck,
    };

    return accessWSClient;
}

private static void ConfigureBinding(WSClient accessWSClient)
{
    System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding
    {
        MaxBufferSize = int.MaxValue,
        ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max,
        MaxReceivedMessageSize = int.MaxValue,
        AllowCookies = true
    };

    binding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
    binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Windows;

    accessWSClient.Endpoint.Binding = binding;
}

1 Ответ

0 голосов
/ 10 ноября 2018

В последнее время эта проблема была решена для меня (с помощью внедрения зависимостей).Тогда нужно просто вызвать AddWcfClient из автозагрузки, чтобы внедрить правильный httpBinding для каждой среды.

В моем случае у меня были адреса http в адресах DEV и https в PROD, поэтому этот парень должен дать вам правильный экземплярhttpBinding для wcf: https или нет.

Суть здесь

public static class HttpBindingExtensions
{
    public static BasicHttpBinding Https => new BasicHttpBinding
    {
        MaxReceivedMessageSize = int.MaxValue,
        MaxBufferSize = int.MaxValue,
        Security = new BasicHttpSecurity()
        {
            Mode = BasicHttpSecurityMode.Transport
        }
    };
    public static BasicHttpBinding Http => new BasicHttpBinding
    {
        MaxReceivedMessageSize = int.MaxValue,
        MaxBufferSize = int.MaxValue
    };

    public static IServiceCollection AddWcfClient<I, T>(this IServiceCollection services, string key)
        where I : class
        where T : class, I
            => services.AddScoped<I>(x => GetWcfInstance<I, T>(key, x));

    private static T GetWcfInstance<I, T>(string key, IServiceProvider x) where I : class where T : class, I
    {
        var type = typeof(T);
        var ctorInfo = type.GetConstructor(new[] { typeof(BasicHttpBinding), typeof(EndpointAddress) });

        var config = (IConfiguration)x.GetService(typeof(IConfiguration));
        var instance = (T)ctorInfo?.Invoke(new object[] { config.GetHttpBinding(key), config.GetEndpointAddress(key) });
        return instance;
    }

    public static EndpointAddress GetEndpointAddress(this IConfiguration config, string key)
    {
        return new EndpointAddress(config[key]);
    }
    public static BasicHttpBinding GetHttpBinding(this IConfiguration config, string key)
    {
        return GetHttpBinding(config[key]);
    }
    public static BasicHttpBinding GetHttpBinding(string uri)
    {
        return uri.StartsWithIgnoreCase("https") ? Https : Http;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...