2012-01-10 2 views
10

Как настроить ServiceClient с помощью сертификационной проверки подлинности в C#?
И я не хочу использовать .config.Конфигурировать клиента службы WCF с аутентификацией сертификатов программным путем

 using(var srv = GetServiceInstance()) 
     { 
      srv.DoStuff() 
     } 

     private TheServiceClient GetServiceInstance() 
     { 
      var service = new TheServiceClient(CreateWsHttpBinding(), CreateEndpointAdress()); 
      return service; 
     } 
     private static WSHttpBinding CreateWsHttpBinding() 
     { 
     var wsHttpBinding = new WSHttpBinding(); 
     wsHttpBinding.Security.Mode = SecurityMode.Message; 

     wsHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
     wsHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; 
     wsHttpBinding.Security.Transport.Realm = ""; 
     wsHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 

     wsHttpBinding.Security.Message.NegotiateServiceCredential = true; 
     wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; 

     wsHttpBinding.Name = "Bindingname"; 
     wsHttpBinding.CloseTimeout = TimeSpan.FromMinutes(1); 
     wsHttpBinding.OpenTimeout = TimeSpan.FromMinutes(1); 
     wsHttpBinding.ReceiveTimeout = TimeSpan.FromMinutes(10); 
     wsHttpBinding.SendTimeout = TimeSpan.FromMinutes(1); 
     wsHttpBinding.BypassProxyOnLocal = false; 
     wsHttpBinding.TransactionFlow = false; 
     wsHttpBinding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 
     wsHttpBinding.MaxBufferPoolSize = 524288; 
     wsHttpBinding.MaxReceivedMessageSize = 65536; 
     wsHttpBinding.MessageEncoding = WSMessageEncoding.Text; 
     wsHttpBinding.TextEncoding = Encoding.UTF8; 
     wsHttpBinding.UseDefaultWebProxy = true; 
     wsHttpBinding.AllowCookies = false; 

     wsHttpBinding.ReaderQuotas.MaxDepth = 32; 
     wsHttpBinding.ReaderQuotas.MaxArrayLength = 16384; 
     wsHttpBinding.ReaderQuotas.MaxStringContentLength = 8192; 
     wsHttpBinding.ReaderQuotas.MaxBytesPerRead = 4096; 
     wsHttpBinding.ReaderQuotas.MaxNameTableCharCount = 16384; 

     wsHttpBinding.ReliableSession.Ordered = true; 
     wsHttpBinding.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(10); 
     wsHttpBinding.ReliableSession.Enabled = false; 

     return wsHttpBinding; 
    } 
     private static EndpointAddress CreateEndpointAdress() 
     { 
      var store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser); 
      store.Open(OpenFlags.ReadOnly); 
      var cert = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, "CN=Certname", false)[0]; 
      store.Close(); 

     var endpointIdentity = EndpointIdentity.CreateX509CertificateIdentity(cert); 
     var endpoint = new EndpointAddress(new Uri("ServiceUri"), endpointIdentity); 

     return endpoint; 
    } 

Итак, это то, что у меня есть до сих пор! Используя это возвращает ошибку:

Сертификат клиента не предоставляется. Укажите клиентский сертификат в ClientCredentials.

У кого-нибудь есть идеи? Будьте нежны, я новичок в этом!

ответ

9

Как было обнаружено в комментариях к другому ответу, вам необходимо установить service.ClientCredentials.ClientCertificate.Certificate.

0

может понадобиться, чтобы увидеть, если этот сертификат виден учетной записи компьютера - предполагая, что вы отлажена на следующий пункт:

var cert = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, "CN=Certname", false)[0];

и он говорит, что не может найти его?

+0

сертификат найден и установлен. service.ClientCredentials.ClientCertificate.Certificate is null – espvar

+0

Разве вы не хотите устанавливать 'service.ClientCredentials.ClientCertificate.Certificate' напрямую? Он задокументирован как чтение-запись, а также для других форм аутентификации клиентов, которые я установил, например. 'ClientCredentials.UserName.UserName' и' ClientCredentials.UserName.Password' непосредственно перед этим. Я думаю, что материал EndpointIdentity предназначен для конечных точек обслуживания, а не для клиентов. – shambulator

+0

Вот что я понял. Когда я помещаю 'service.ClientCredentials.ClientCertificate.Certificate = store.Certificates.Find (X509FindType.FindBySubjectDistinguishedName," CN = CertName ", false) [0];' В методе GetServiceInstance он работал. Мне также нужно было сохранить EndpointIdentity, где я добавил 'var endpointIdentity = EndpointIdentity.CreateDnsIdentity (" DnsIdentity ");' – espvar

0

Я думаю, вам не хватает Описание контракта. Вот небольшой пример о том, как это сделать. Если у вас есть дополнительные проблемы, у меня есть полный рабочий код. Я помогу тебе.

КонтрактОписание контракта = КонтрактDescription.GetContract (typeof (IEvalService), typeof (EvalServiceClient));

Перед открытием прокси-сервера необходимо выполнить инициализацию с клиентом. Надеюсь, он сработает.

получают удовольствие