C # WCF и сертификат FaultException - PullRequest
       4

C # WCF и сертификат FaultException

0 голосов
/ 12 сентября 2010

Я хотел бы реализовать службу WCF с сертификатами сервера и клиента.

Когда я пытаюсь подключиться к службе на IIS, я получаю следующую ошибку:

Тестовый метод TestProject1.UnitTest1.TestMethod1 вызвала исключение: System.ServiceModel.Security.SecurityNegotiationException: безопасный канал не может быть открыт, потому что сбой согласования безопасности с удаленной конечной точкой.Это может быть связано с отсутствием или неправильным указанием EndpointIdentity в EndpointAddress, используемом для создания канала.Убедитесь, что EndpointIdentity, указанный или подразумеваемый в EndpointAddress, правильно идентифицирует удаленную конечную точку.---> System.ServiceModel.FaultException: запрос токена безопасности содержит недопустимые или неправильно сформированные элементы ..

Мой web.config:

<system.serviceModel>
    <bindings>
       <wsHttpBinding>
          <binding name="DotNetStoreBinding" receiveTimeout="00:00:15">
             <reliableSession inactivityTimeout="00:00:20" />
             <security mode="Message">
                <message clientCredentialType="Certificate"/>
             </security>
          </binding>
       </wsHttpBinding>
    </bindings>
    <services>
        <service behaviorConfiguration="ServiceBehavior" name="WcfServiceCustumer.Service1">
            <endpoint binding="wsHttpBinding" contract="WcfServiceCustumer.IService1">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true"/>
                <serviceCredentials>
                    <serviceCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName" findValue="CN=DotNetStore" />
                    <clientCertificate>
                      <certificate storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectDistinguishedName" findValue="CN=Bob"/>
                      <authentication certificateValidationMode="PeerTrust" />
                    </clientCertificate>
                </serviceCredentials>
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

После того, как я создал серверЯ создал новый проект и добавил ссылку на сервис.Я звоню в службу так:

EndpointAddress address = new EndpointAddress(
        new Uri("http://localhost/CustomerServiceSite/Customer.svc"),
        EndpointIdentity.CreateDnsIdentity("DotNetStore"),
        new AddressHeaderCollection()
    );

WSHttpBinding binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;

var client = new CustomerService.Service1Client(binding, address);

client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust;
client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectDistinguishedName, "CN=Bob");

IList<Product> allProducts = client.GetAllProducts();

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 12 сентября 2010

Проблема возникла из-за сертификатов. У меня не было правильных пар на клиенте и обслуживании.

Хорошее описание того, как правильно использовать сертификаты, можно найти здесь: http://www.codeproject.com/KB/WCF/9StepsWCF.aspx?msg=3181718

...