Как настроить 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.
У кого-нибудь есть идеи? Будьте нежны, я новичок в этом!
сертификат найден и установлен. service.ClientCredentials.ClientCertificate.Certificate is null – espvar
Разве вы не хотите устанавливать 'service.ClientCredentials.ClientCertificate.Certificate' напрямую? Он задокументирован как чтение-запись, а также для других форм аутентификации клиентов, которые я установил, например. 'ClientCredentials.UserName.UserName' и' ClientCredentials.UserName.Password' непосредственно перед этим. Я думаю, что материал EndpointIdentity предназначен для конечных точек обслуживания, а не для клиентов. – shambulator
Вот что я понял. Когда я помещаю 'service.ClientCredentials.ClientCertificate.Certificate = store.Certificates.Find (X509FindType.FindBySubjectDistinguishedName," CN = CertName ", false) [0];' В методе GetServiceInstance он работал. Мне также нужно было сохранить EndpointIdentity, где я добавил 'var endpointIdentity = EndpointIdentity.CreateDnsIdentity (" DnsIdentity ");' – espvar