BasicHttpBinding с проверкой подлинности сертификата - ошибка "запрещено"? - PullRequest
6 голосов
/ 08 апреля 2009

Я пытаюсь получить WCF-сервер и клиент взаимно аутентифицируют друг друга, используя SSL-сертификаты на транспортном уровне, используя BasicHttpBinding. Вот как создается сервер:

var soapBinding = new BasicHttpBinding() { Namespace = "http://test.com" };
soapBinding.Security.Mode = BasicHttpSecurityMode.Transport;
soapBinding.Security.Transport.ClientCredentialType =
    HttpClientCredentialType.Certificate;
var sh = new ServiceHost(typeof(Service1), uri);
sh.AddServiceEndpoint(typeof(IService1), soapBinding, "");
sh.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine, StoreName.My, 
    X509FindType.FindBySubjectName, "localhost");
sh.Open();

Вот клиент:

var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.Transport;
var service = new ServiceReference2.Service1Client(binding,
    new EndpointAddress("https://localhost:801/Service1"));

service.ClientCredentials.ClientCertificate.SetCertificate(
    StoreLocation.LocalMachine, StoreName.My, 
    X509FindType.FindBySubjectName, "localhost");

service.ClientCredentials.ServiceCertificate.Authentication.
    CertificateValidationMode =
        System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust;

service.HelloWorld();

Сертификат для localhost находится в личных, доверенных корневых и доверенных сторонних контейнерах. Internet Explorer может подключиться к хосту и увидеть WSDL. Кроме того, вызовы SSL работают нормально с ClientCredentialType = HttpClientCredentialType.None

HelloWorld () завершается с:

System.ServiceModel.Security.MessageSecurityException occurred<br/>
  Message="The HTTP request was forbidden with client authentication
  scheme 'Anonymous'."

, которое является повторно вызванным исключением из: «Удаленный сервер возвратил ошибку: (403) Запрещено».

как можно выяснить, что происходит в wtf?

Ответы [ 2 ]

9 голосов
/ 10 апреля 2009

Попробуйте добавить это в клиент сразу после установки Security.Mode:

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
1 голос
/ 11 сентября 2015

Если вы используете стандартный сгенерированный прокси-класс, вы можете установить тип учетных данных транспортного клиента Certificate в App.Config:

<binding name="SpoDataServiceSoap">
    <security mode="Transport">
        <transport clientCredentialType="Certificate"></transport>
    </security>
</binding>

C #

var client = new MyServiceSoapClient()
X509Certificate2 cert = CertificateHelper.GetClientCertificate();
client.ClientCredentials.ClientCertificate.Certificate = cert;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...