2010-12-28 7 views
2

Ich versuche, einen Java-basierten, WS-Security-fähigen Web-Service über HTTPS mit einem WCF-Client aufrufen und scheint nicht die Sicherheitskonfiguration richtig zu bekommen. Mit SvcTraceViewer sehe ich den erwarteten Sicherheitsheader mit keiner der Sicherheitskonfigurationen, die ich ausprobiert habe.Konfigurieren WCF für WS-Sicherheit mit Benutzername über https

Meine jüngste Sicherheitskonfiguration ist:

<wsHttpBinding> 
     <binding name="MySoapBinding" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="TransportWithMessageCredential"> 
      <transport/> 
      <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false"/> 
      </security> 
     </binding> 
    </wsHttpBinding> 

und ich den Benutzernamen/Passwort in Code wie folgt:

svc.ClientCredentials.UserName.UserName = TestBase.userName; 
    svc.ClientCredentials.UserName.Password = TestBase.password; 

Die Java-Web-Service eine Sicherheitsheader wie folgt erwartet:

<wsse:Security soap:mustUnderstand="1"> 
<wsu:Timestamp wsu:Id="Timestamp-bf41c571-7d32-438c-937e-7d83a3ac2d14"> 
<wsu:Created>2010-12-27T16:43:16Z</wsu:Created> 
<wsu:Expires>2010-12-27T16:48:16Z</wsu:Expires> 
</wsu:Timestamp> 
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-4c9b30b1-d697-4c64-89cb-a6d7e857aebf"> 
<wsse:Username>MyUserName</wsse:Username> 
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">MyPassword</wsse:Password> 
<wsse:Nonce>pzLdD4S+OCDG6Ut9Ur1oOQ==</wsse:Nonce> 
<wsu:Created>2010-12-27T16:43:16Z</wsu:Created> 
</wsse:UsernameToken> 
</wsse:Security> 

Ich sehe keine Sicherheit Header überhaupt.

Ich habe ziemlich viel online über Transport und Nachrichtenebene Sicherheits-und Sicherheitsmodi gelesen, aber kann nicht scheinen, die richtigen Optionen zu finden. Wie konfiguriere ich meine Bindung für

  • https Kommunikation
  • Benutzername/passowrd im SOAP-Header, im Klartext (WS-Security)
  • Zeitstempel erforderlich
  • Nonce
  • erforderlich
+0

Wie überprüfen Sie, ob Header enthalten ist? WCF unterstützt das Benutzernamen-Token-Profil über den gesicherten Transportkanal, unterstützt jedoch nur das Nur-Text-Passwort, das keine zusätzlichen Elemente benötigt. Ich habe also ein bisschen Angst, dass es keine Nonce und erzeugten Elemente sendet. –

+0

@Ladislav: Ich benutze SvcTraceViewer, um das lokale Trace-Protokoll anzuzeigen (und die Nachrichtenprotokollierung in meiner app.config aktiviert) –

Antwort

3

Es stellte sich heraus, Rick Strahl hatte fast genau das gleiche Problem. Es stellt sich heraus, dass SvcTraceViewer nicht zeigt die tatsächliche on-the-Wire-Nachricht. Sein Blog beschreibt jedoch ein Verfahren, um durch Charles (oder in meinem Fall Fiddler 2, das kostenlos ist) durch Proxy die tatsächliche Nachricht zu sehen.

Es stellt sich heraus, dass ich ein Timestamp-Element wie vom Webdienst, den ich anrufe, senden, aber wenn ich das tue, fordert WCF einen Timestamp in der Antwort (die ich nicht bekomme). Die Fehlermeldung ist ziemlich irreführend. Glücklicherweise kann ich den Dienst ändern lassen, um einen Zeitstempel zurückzugeben.

http://www.west-wind.com/weblog/posts/205198.aspx

+0

Um zu sehen, die tatsächliche Nachricht in SvcTraceViewer müssen Sie logMessagesAtTransportLevel = "true" ' tmanthey

Verwandte Themen