2010-09-24 12 views
8

Potrzebuję świadczyć usługę osobie trzeciej, która będzie wysyłać wiadomości z mydłem z podpisanym znacznikiem czasu.Usługa WCF z WS-Security wymaga tylko podpisanego znacznika czasu.

Jak mogę skonfigurować moją usługę, aby to obsługiwać?

UPDATE udało mi się zbliżyć do formatu komunikatu SOAP, że jesteśmy po WCF ale nalega na podpisanie zarówno nazwę użytkownika i tokenów znacznika czasu, Czy istnieje sposób zmodyfikować wiązania się podpisywać tylko znacznik czasu?


Dalsze Aktualizacja Oto nasze wymagania:

  • Element Datownik muszą być podpisane.
  • Nazwa CN na certyfikacie użytym do podpisania musi pasować do nazwy użytkownika give w elemencie UsernameToken.
  • Certyfikat użyty do podpisania MUSI zostać wysłany w elemencie BinarySecurityToken.
  • Element KeyInfo MUSI zawierać tylko element SecurityTokenReference, który musi być użyty do odniesienia do BinarySecurityToken.
  • Należy określić algorytm kanonizacji.
  • Podpisanie MUSI zostać określone i MUSI być aliasem SHA-1 lub SHA-2.
  • Należy używać podpisów wolnostojących.

Wszelkie sugestie?

aktualnej konfiguracji

Client Oprawa

<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> 

klienta końcowego

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

Client Zachowanie

<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> 

Usługa Oprawa

<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

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

usługi Zachowanie

<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

Czy udało się skonfigurować konfigurację tak, aby tylko element datownika był podpisany? Obecnie próbuję osiągnąć to samo. – Edward

Odpowiedz

3

Można rozważyć wiążący niestandardowej klasy zabezpieczeń, który implementuje bezpieczeństwu tak, jak chcesz, a niż domyślne WCF.

Te linki MSDN wyjaśnić niestandardowe Wiązania i SecurityBindingElement abstrakcyjna klasa podstawowa:

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

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

+0

To nie byłem ja! Wyciągam włosy z opasek, żeby uzyskać niestandardowe wiązanie, by uzyskać prawidłowe wyniki! Powinienem zaktualizować pytanie, ponieważ teraz w zasadzie to, czego chcę, to basicHttpBinding (Soap 1.1) z trybem bezpieczeństwa = TransportWithMessageCredential z certyfikatem zarówno dla wiadomości, jak i transportu .. Ale dodatkowo musimy wysyłać/odbierać UsernameToken jako ...! –

+0

Dzięki za komentarz @Dog Ears, czy uważasz, że warto utworzyć nowe pytanie z bardziej szczegółową prośbą? –

0

Można to zrobić z umowami wiadomości, patrz: http://msdn.microsoft.com/en-us/library/ms730255.aspx

Oto przykład z powyższego linku:

[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; 
} 

Należy zwrócić uwagę na poziomy ochrony Brak, Zarejestruj, EncryptAndSign

+0

Nie sądzę, że to zadziała W zasadzie próbuję dodać wsse: UserNameToken, ale użycie tego podejścia nie działa, ponieważ framework rozpoznaje token i zgłasza błąd, ponieważ nie jest oczekiwany jako część powiązania? –

1

WCF nie pozwala na podpisanie znacznika czasu, ale nie na nazwę użytkownika. Po pierwsze jestem prawie pewien, że nie jest to związane z problemem, z którym masz do czynienia - serwer powinien obsługiwać oba te przypadki. Jeśli jest to potrzebne, sugeruję, aby w ogóle nie używać nazwy użytkownika w zabezpieczeniach (np. Tryb bezpieczeństwa "anonimowy certyfikat"), a następnie zaimplementować niestandardowy koder wiadomości, aby ręcznie wprowadzić znaczniki nazwy użytkownika/hasła do nagłówka we właściwym miejscu (weź nie należy zmieniać żadnej podpisanej części wiadomości, głównie znacznika czasu).

+0

To stare pytanie, które chciałem rozwiązać, pierwotne wymaganie dotyczyło tylko nazwy użytkownika, bez hasła (nazwa użytkownika miała zawierać wspólną nazwę certyfikatu SSL). Zostaliśmy narzuceni, musieliśmy wdrożyć zarówno serwer, jak i klienta, który łączyłby się z systemem innej firmy, nad którym nie mieliśmy kontroli (Java). Daję koderowi wir, przydatne będą wszelkie linki do informacji o kodowaniu niestandardowym. Z poważaniem. –

+0

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