Использовать веб-сервисы c # /. net с сертификатами и настройкой безопасности, также без добавления ссылки на сервис? - PullRequest
0 голосов
/ 17 апреля 2020

Я новичок в. net и веб-службах

Можно использовать веб-службы c # /. net с сертификатами и настройкой безопасности, также без добавления ссылки на службу?

Если да, то как это сделать

WCF или WSE?

Как добавить к нему политику безопасности?

Я уже посмотрел WCF, httpclient, X509store, сертификаты, WSE в официальных документах, но я не знал, что подать заявку через код.

Мне нужен ответ в строке

Спасибо

1 Ответ

0 голосов
/ 21 апреля 2020

Добавление сервисной ссылки обычно используется для генерации клиентского прокси, в то время как генерация клиентского прокси может быть выполнена с помощью фабрики каналов. Поэтому, согласно вашему требованию, мы просто создаем серверную часть WCF с аутентификацией клиента с помощью сертификата, этого достаточно.
И клиенту удается вызвать службу через ChannelFactory. Вот пример.
Сервер -side (консольное приложение)

    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("http://localhost:21011");
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.Security.Mode = BasicHttpSecurityMode.Message;
            binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
            using (ServiceHost sh = new ServiceHost(typeof(MyService), uri))
            {
                sh.AddServiceEndpoint(typeof(IService), binding, "");
                ServiceMetadataBehavior smb;
                smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (smb == null)
                {
                    smb = new ServiceMetadataBehavior()
                    {
                        HttpGetEnabled = true
                    };
                    sh.Description.Behaviors.Add(smb);
                }

                sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "5ba5022f527e32ac02548fc5afc558de1d314cb6");
                Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
                sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");


                sh.Opened += delegate
                {
                    Console.WriteLine("Service is ready");
                };
                sh.Closed += delegate
                {
                    Console.WriteLine("Service is clsoed");
                };
                sh.Open();
                Console.ReadLine();
                //pause
                sh.Close();
                Console.ReadLine();
            }
        }
    }
    [ServiceContract]

    public interface IService
    {
        [OperationContract]
        string Test();
    }
    public class MyService : IService
    {
        public string Test()
        {
            return DateTime.Now.ToLongTimeString();
        }

}

На стороне клиента мы можем использовать услугу с помощью фабрики каналов.

class Program
    {
        static void Main(string[] args)
        {
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.Security.Mode = BasicHttpSecurityMode.Message;
            binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
            Uri uri = new Uri("http://vabqia969vm:21011");
            ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, new EndpointAddress(uri));
            factory.Credentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine, StoreName.Root, X509FindType.FindByThumbprint, "5ba5022f527e32ac02548fc5afc558de1d314cb6");
            factory.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "f0969c5725b2f142b7f150515ec2bd12bc45250b");
            var service = factory.CreateChannel();
            var result = service.Test();
            Console.WriteLine(result);

        }

    }
    [ServiceContract]

    public interface IService
    {
        [OperationContract]
        string Test();
}

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

...