2010-09-24 6 views
8

Ich muss einen Dienst für eine Drittpartei bereitstellen, die Soap-Nachrichten mit einem signierten Timestamp sendet.WCF-Dienst mit WS-Security erfordert nur Signed Timestamp

Wie kann ich meinen Dienst konfigurieren, um dies zu unterstützen?

UPDATE Ich habe es geschafft, nahe dem Format der SOAP-Nachricht zu erhalten, die wir nach, aber WCF besteht darauf, sowohl den Benutzernamen auf die Unterzeichnung und die Zeitstempel-Token, Gibt es eine Möglichkeit die Bindung an zu modifizieren nur den Zeitstempel unterschreiben?


Weitere Update- Hier sind unsere Anforderungen:

  • Die Timestamp-Element zu unterzeichnen.
  • Der CN-Name des Zertifikats, das für die Signierung verwendet wird, muss mit dem Benutzernamen "gib" im UsernameToken-Element übereinstimmen.
  • Das zum Signieren verwendete Zertifikat MUSS im BinarySecurityToken-Element gesendet werden.
  • Das KeyInfo-Element muss nur ein SecurityTokenReference-Element enthalten, das für den Verweis auf das BinarySecurityToken verwendet werden muss.
  • Ein Canonicalization-Algorithmus muss angegeben werden.
  • Die SignatureMETHOD muss angegeben werden und muss der SHA-1- oder SHA-2-Algorithmus sein.
  • Freistehende Signaturen sollten verwendet werden.

Irgendwelche Vorschläge?

CURRENT CONFIG

Client-Bindung

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

Client-Endpoint

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

Client-Verhalten

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

Dienstbindung

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

Service-Verhalten

<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

Haben Sie die Konfiguration so konfiguriert, dass nur das Timestamp-Element signiert wurde? Ich versuche gerade, dasselbe zu erreichen. – Edward

Antwort

3

Möglicherweise möchten Sie eine benutzerdefinierte Sicherheitsbindungsklasse berücksichtigen, dass die Sicherheit, so wie Sie es wollen implementiert, eher als der WCF-Standard.

Diese MSDN Links erklären Individuelle Bindungen und die Security abstrakte Basisklasse:

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

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

+0

Es war nicht ich! Ich habe mir die Haare ausgerissen, um eine benutzerdefinierte Bindung zu bekommen, um die richtigen Ergebnisse zu erzielen! Ich sollte die Frage aktualisieren, wie jetzt im Grunde, was ich will, ist basicHttpBinding (Soap 1.1) mit Sicherheitsmodus = TransportWithMessageCredential mit beiden Zertifikat für Nachricht und Transport .. Aber zusätzlich müssen wir auch die UsernameToken senden/empfangen ..! –

+0

Danke für den Kommentar @Dog Ears, denken Sie, dass es sich lohnt, eine neue Frage mit Ihrer spezifischeren Anfrage zu erstellen? –

0

Sie können diese Verträge mit der Meldung finden Sie unter: http://msdn.microsoft.com/en-us/library/ms730255.aspx

Hier ist ein Beispiel aus dem obigen Link:

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

Beachten Sie die Schutzstufen Keine, Zeichen, EncryptAndSign

+0

Ich glaube nicht, dass dies funktioniert Ich versuche im Grunde, eine wsse hinzuzufügen: UserNameToken, aber diese Methode funktioniert nicht, da das Framework das Token erkennt und einen Fehler auslöst, da es nicht als Teil der Bindung erwartet wird? –

1

WCF nicht nativ erlauben den Zeitstempel zu unterschreiben, aber nicht der Benutzername. Zuerst bin ich mir ziemlich sicher, dass dies nicht mit dem Problem zusammenhängt, mit dem Sie konfrontiert sind - ein Server sollte in der Lage sein, beide Fälle zu behandeln. Wenn Sie es brauchen, schlage ich vor, den Benutzernamen überhaupt nicht in der Sicherheit zu verwenden (zB Sicherheitsmodus von "anonymousForCertificate") und dann einen benutzerdefinierten Nachrichtenencoder zu implementieren, um die Benutzernamen/Passwort Tags manuell in die Kopfzeile zu schieben (take Achten Sie darauf, keinen signierten Teil in der Nachricht zu ändern, hauptsächlich den Zeitstempel.

+0

Es ist eine alte Frage, die ich nur lösen wollte, die ursprüngliche Anforderung war nur für den Benutzernamen, ohne ein Passwort (der Benutzername sollte den gemeinsamen Namen SSL-Cert halten). Wir wurden diktiert, wir mussten sowohl Server als auch Client implementieren, die eine Verbindung zu einem System von Drittanbietern herstellen würden, über das wir keine Kontrolle hatten (Java). Ich gebe dem Encoder einen Wirbel, alle Links zu Informationen über benutzerdefinierte Codierung wäre nützlich. Mit freundlichen Grüßen. –

+0

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