2009-04-08 12 views
6

Sto provando a fare in modo che il server e il client WCF si autenticano reciprocamente utilizzando i certificati SSL a livello di trasporto utilizzando BasicHttpBinding. Ecco come è sempre creato il server:BasicHttpBinding con autenticazione del certificato - errore "vietato"?

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(); 

Ecco il cliente:

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(); 

certificato per localhost è in Personal, radice di fiducia e di fiducia contenitori 3rd Party. Internet Explorer può connettersi all'host e vedere WSDL. Inoltre, le chiamate SSL funzionano bene con clientCredentialType = HttpClientCredentialType.None

HelloWorld() non riesce con:

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

che è un'eccezione rilanciati da: "Il server remoto ha restituito un errore:. (403) Forbidden"

come si va in giro a capire che sta succedendo?

risposta

9

Prova ad aggiungere questo nel client solo dopo aver impostato Security.Mode:

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
+0

Non posso credere che fosse così facile e io non prenderla :( – galets

+0

Ho lo stesso problema, ma dove l'app.config ha: nell'elemento di trasporto :-( – Ronnie

+0

Sto cercando di risolvere un problema simile - Ho appena provato il tuo codice ma "aggiungi riferimento servizio" non ha funzionato sul client . Non credo che potresti allegare la tua intera soluzione? – user1229458

0

La risposta è già fatto, ma per gli altri:

se si utilizza standart proxy generato che è configurato in app.config è necessario impostare transport clientCredentialType a Certificate

(assicurarsi l'elemento XML non è <message clientCredentialType ... />)

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

C#

MyServiceSoapClient client = new MyServiceSoapClient() 
X509Certificate2 cert = CertificateHelper.GetClientCertificate(); 
client.ClientCredentials.ClientCertificate.Certificate = cert; 
Problemi correlati