2010-09-24 29 views
8

İmzalı bir Zaman damgasıyla sabun iletileri gönderecek üçüncü tarafa bir servis sağlamanız gerekir.WCF Hizmeti yalnızca İmzalı Zaman Damgası gerektirir

Hizmetimi bunu desteklemek için nasıl yapılandırabilirim?

Ben yakın Peşinde olduğumuz ancak WCF kullanıcı adı ve zaman damgası belirteçleri hem imzalanması konusunda ısrar Sabun mesajın formatına başardı ettik GÜNCELLEME, bağlanma değiştirmek için bir yolu var mı sadece zaman damgasını imzala? Zaman Damgası eleman imzalanacak MUTLAKA

  • : Burada


    ayrıntılı Güncelleme bizim gereksinimleri vardır.

  • İmza için kullanılan sertifikanın CN adı, UsernameToken öğesindeki Kullanıcı adı verisiyle eşleşmesi ZORUNLU dur.
  • İmza için kullanılan sertifika, BinarySecurityToken öğesinde gönderilmelidir.
  • KeyInfo öğesi yalnızca BinarySecurityToken'a başvurmak için kullanılması gereken bir SecurityTokenReference öğesi içermemelidir.
  • Bir kanonikleştirme algoritması belirtilmelidir.
  • SignatureMethod belirtilmelidir ve SHA-1 veya SHA-2 algoritması OLMALIDIR.
  • Müstakil İmzalar KULLANILMALIYOR.

herhangi bir öneriniz?

MEVCUT CONFİG

<bindings> 
    <wsHttpBinding> 
    <binding name="WSBC"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Certificate" proxyCredentialType="None"></transport> 
     <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

Müşteri bitiş noktası Bağlanma Müşteri

<client> 
    <endpoint address="https://localhost/WcfTestService/Service2.svc" 
    behaviorConfiguration="CCB" binding="wsHttpBinding" 
    bindingConfiguration="WSBC" 
    contract="ServiceReference2.IService2" 
    name="wsHttpBinding_IService2" /> 
</client> 

Müşteri davranışı

<behaviors> 
    <endpointBehaviors> 
    <behavior name="MBB"> 
     <clientCredentials> 
     <clientCertificate findValue="03 58 d3 bf 4b e7 67 2e 57 05 47 dc e6 3b 52 7f f8 66 d5 2a" 
          storeLocation="LocalMachine" 
          storeName="My" 
          x509FindType="FindByThumbprint" /> 
     <serviceCertificate> 
      <defaultCertificate findValue="03 58 d3 bf 4b e7 67 2e 57 05 47 dc e6 3b 52 7f f8 66 d5 2a" 
           storeLocation="LocalMachine" 
           storeName="My" 
           x509FindType="FindByThumbprint" /> 
     </serviceCertificate> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<bindings> 
    <wsHttpBinding> 
    <binding name="ICB"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Certificate" proxyCredentialType="None"></transport> 
     <message clientCredentialType="UserName" 
        negotiateServiceCredential="false" 
        establishSecurityContext="false" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

Serice Endpoint BağlamaServis

<service name="WcfTestService.Service2" behaviorConfiguration="SCB"> 
    <endpoint  address="" binding="wsHttpBinding" contract="WcfTestService.IService2" 
    bindingConfiguration="ICB" name="MS" /> 
</service> 

Servis Davranış

<behaviors> 
    <serviceBehaviors> 
    <behavior name="SCB"> 
     <serviceCredentials> 
     <serviceCertificate  findValue="4d a9 d8 f2 fb 4e 74 bd a7 36 d7 20 a8 51 e2 e6 ea 7d 30 08" 
           storeLocation="LocalMachine" 
           storeName="TrustedPeople" 
           x509FindType="FindByThumbprint" /> 
     <userNameAuthentication 
      userNamePasswordValidationMode="Custom" 
      customUserNamePasswordValidatorType="WcfTestService.UsernameValidator, WcfTestService" /> 
     <clientCertificate> 
      <authentication certificateValidationMode="None" revocationMode="NoCheck" /> 
     </clientCertificate> 
     </serviceCredentials> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
+1

Yalnızca Timestamp öğesinin imzalanması için yapılandırmanın çalışmasını sağladınız mı? Şu anda aynı şeyi elde etmeye çalışıyorum. – Edward

cevap

3

Sen doğrusu, güvenlik bunu istediğiniz gibi uygulayan özel güvenlik bağlama sınıfını dikkate almak isteyebilirsiniz WCF varsayılanından daha.

Bunlar MSDN bağlantıları

Özel Bağlar ve SecurityBindingElement soyut temel sınıfını açıklamak:

http://msdn.microsoft.com/en-us/library/ms730305.aspx

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.securitybindingelement.aspx

+0

Ben değildim! Doğru sonuçları elde etmek için özel bir ciltleme yapmak için saçlarımı soyuyorum. Ben şu anda temel olarak istediğim, temel olarak, güvenlik modu = SafetyWithMessageCredential güvenlik modu ile basicHttpBinding (Soap 1.1) mesaj ve taşıma için her iki sertifika ile güncellemeliyim .. Ama ek olarak, UsernameToken aswell'i gönderip almamız gerekiyor ..! –

+0

@Dog Ears yorumunuz için teşekkürler, daha özel isteğinizle yeni bir soru oluşturmaya değer mi? –

0

İletinin sözleşmeleri ile yapabilirsiniz, bkz: Burada

http://msdn.microsoft.com/en-us/library/ms730255.aspx bir örnektir Yukarıdaki bağlantıdan:

[MessageContract] 
public class PatientRecord 
{ 
    [MessageHeader(ProtectionLevel=None)] public int recordID; 
    [MessageHeader(ProtectionLevel=Sign)] public string patientName; 
    [MessageHeader(ProtectionLevel=EncryptAndSign)] public string SSN; 
    [MessageBodyMember(ProtectionLevel=None)] public string comments; 
    [MessageBodyMember(ProtectionLevel=Sign)] public string diagnosis; 
    [MessageBodyMember(ProtectionLevel=EncryptAndSign)] public string medicalHistory; 
} 

Not koruma seviyeleri Yok, İşaret, EncryptAndSign

+0

Bunun işe yarayacağını sanmıyorum Temelde bir wsse eklemeye çalışıyorum: UserNameToken ama bu yaklaşımın kullanılması, çerçeve tanımayı tanıdığı ve bir parçanın bağlanma olarak beklenmediği bir hata verdiği için işe yaramıyor mu? –

1

WCF doğal zaman damgası ancak kullanıcı adı imzalamak izin vermez. İlk olarak, bunun karşı karşıya olduğunuz sorunla ilgili olmadığından eminim - bir sunucu her iki durumu da ele geçirebilmelidir. İhtiyacınız varsa, o zaman kullanıcı adı ve güvenlik etiketlerini (örneğin "anonymousForCertificate" güvenlik modu) kullanmamayı ve sonra kullanıcı adı/parola etiketlerini doğru yere doğru başlığa yerleştirmek için özel bir mesaj kodlayıcısı uygulamanızı öneririm. Mesajdaki herhangi bir işaretli kısmı değiştirmemeye özen gösterin, özellikle zaman damgası).

+0

Sadece çözmek istediğim eski bir soru, asıl gereklilik sadece kullanıcı adı için bir parola olmaksızın (kullanıcı adı SSL sertifikasının genel adını tutmaktı) idi. Dikkate alınmaktayız, (Java) üzerinde hiçbir kontrolümüz olmayan üçüncü taraf bir sisteme bağlanacak sunucu ve istemcileri uygulamak zorundaydık. Kodlayıcıya bir girdap vereceğim, özel kodlamayla ilgili herhangi bir bilgi bağlantısı faydalı olacaktır. Saygılarımla. –

+0

http://msdn.microsoft.com/en-us/library/ms751486.aspx –