2012-05-24 2 views
0

Создание клиентского приложения для использования WCF, защищенного сертификатом. Сертификат установлен и может получить доступ к WSDL через IE, но приложение выбрасывает «Ошибка FaultException» 1 была неписана: «Недействительный сертификат» после того, как он ударил CaseExists. Есть идеи? Если сертификат недействителен, не будет ли он ошибкой при попадании в WSDL в IE?FaultException `1 был необработанным: недействительный сертификат?

using System; 
using System.Configuration; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ServiceModel; 
using System.ServiceModel.Security; 
using System.Security.Cryptography.X509Certificates; 
using System.ServiceModel.Description; 
using ConsoleApplication1.ServiceReference1; 
using System.Diagnostics; 
using System.ServiceModel.Channels; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // binding 
      BasicHttpBinding b = new BasicHttpBinding(); 
      b.Security.Mode = BasicHttpSecurityMode.Transport; 
      b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 

      // endpoint 
      EndpointAddress ea = new EndpointAddress(
       "https://cut out endpoint.svc"); 

      // fire it up 
      EBondingClient client = new EBondingClient(b, ea); 

      // toss in cert    
      client.ClientCredentials.Peer.PeerAuthentication.CertificateValidationMode = 
       System.ServiceModel.Security.X509CertificateValidationMode.None; 

      client.ClientCredentials.ClientCertificate.SetCertificate(
       StoreLocation.CurrentUser, 
       StoreName.My, 
       X509FindType.FindBySubjectName, 
       "cut.out.cert.name"); 

      // call 
      Console.WriteLine(client.CaseExists("hello world")); 
      client.Close(); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

WSDL не применяет ту же защиту, что и фактическая услуга. Таким образом, пользователи могут получить доступ к схеме службы, не зная, как аутентифицироваться. – mellamokb

+0

Я согласен с вами в этом предположении; но ребята, которые построили этот wsdl/wcf, имеют сертификат, защищающий wsdl. Это мой первый раз, когда мы имеем дело с wcf и занимаемся только традиционным материалом soap/wsdl с помощью javascript в классе до этого. моя первая реакция тоже была «почему в мире вам нужен сертификат, установленный для доступа к wsdl?» - Возможно ли, что сертификат действителен для доступа к WSDL, но не к конечной точке? –

ответ

1

Вы получаете типизированное исключение вины (это то, что означает FaultException``1). Насколько мне известно, они могут быть явно выбрасываны кодом сервера. Если хост службы обнаружил проблему с сертификатом, он должен выбрасывать MessageException.

Я бы проверил фактический код CaseExists, чтобы узнать, выбрасывает ли он и FaultException<> классы и начнется там. Кроме того, попробуйте поймать FaultException и посмотреть, какой тип объекта имеет свойство Detail, так как обычно содержит дополнительную информацию о сбое. (В частности, каждый отдельный FaultException<T> конкретный тип будет иметь public T Detail свойство.)

Кроме того, я не думаю, что это связано, но вы уверены, что необходимо указать на стороне клиента сертификат? Это отдельно от сертификата на стороне сервера, который защищает службу (и WSDL). Необычно (хотя и неслыханно) для сервера требовать от клиента предоставления сертификата, поэтому я бы подтвердил, что вы поступаете правильно.

+0

Спасибо! Когда я приеду на работу, я посмотрю на это. Я дам Вам знать. –

Смежные вопросы