2009-04-08 39 views
6

WCF sunucusunu ve istemciyi, BasicHttpBinding kullanarak taşıma düzeyinde SSL sertifikalarını kullanarak birbirlerini karşılıklı olarak kimlik doğrulaması yapmaya çalışıyorum. İşte sunucu hazırlandı elde ettiğini nasıl:BasicHttpBinding - hata "yasak"?

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

İşte müvekkilimiz: localhost için

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

Belgesi Kişisel, Güvenli Kök ve Güvenilen 3. Taraf kaplarda olduğunu. Internet Explorer ana bilgisayara bağlanabilir ve WSDL'yi görebilir. Bir rethrown istisna olduğu

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

:: Ayrıca, SSL aramaları ClientCredentialType = HttpClientCredentialType.None

HelloWorld() sorunsuz şekilde çalışır başarısız olur "Uzak sunucu hata döndürdü:. (403) Yasak"

wtf'nin nasıl devam ettiğini öğrenmek nasıl oluyor?

cevap

9

deneyin sadece Security.Mode ayarladıktan sonra istemci bu ekleme:

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

o kadar kolay oldu ve bunu anlayamadım :( – galets

+0

Ben aynı sorun var ama inanamıyorum app.config sahip olduğu: aktarım öğesinde :-( – Ronnie

+0

Benzer bir sorunu çözmeye çalışıyorum - Kodunuzu denedim ancak "hizmet referansı ekle" istemcisinde çalışmadı . Bütün çözümünüzü ekleyebileceğinizi sanmıyorum? – user1229458

0

cevap zaten bitmiş ama diğerleri için olduğu:

Eğer App.Config yapılandırılan standart oluşturulan proxy kullanıyorsanız eğer Eğer

(xml elemanı <message clientCredentialType ... /> olmadığından emin olun) Certificate

-transport clientCredentialType ayarlamak zorunda

  <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; 
İlgili konular