Аутентификация на сервисе по UsernameToken - нужен PasswordDigest вместо PasswordText

Bator
Дата: 04.06.2014 18:53:45
Подскажите как настроить аутентификацию на java веб-сервисе по UsernameToken - нужен PasswordDigest вместо PasswordText.
Net4.0

На сервис уходит

<soapenv:Envelope ...>
<s:Header>
...
</s:Header>
<soapenv:Body>
...
</soapenv:Body>
</soapenv:Envelope>

У меня сейчас получается так (сниффером получил):

  <s:Header>
<ActivityId CorrelationId="5bc9b16a-c77c-411d-bd74-daded7988de1" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">843cfdad-6891-439e-aa1b-eb811d0c3d5f</ActivityId>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="_0">
<u:Created>2014-06-04T13:46:05.101Z</u:Created>
<u:Expires>2014-06-04T13:51:05.101Z</u:Expires>
</u:Timestamp>
<o:UsernameToken u:Id="uuid-a73d0d22-4b99-4739-9439-352e5e8f0c73-1">
<o:Username>XX</o:Username>
<o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">XXXX</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>

А должно быть примерно так:

  <soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-BA4BAEFA397054753514018919701993">
<wsse:Username>XX</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">bHbVylUKBb9d6ulsLEuS3scSk4I=</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">9P5fQM0q6b3honKflB9r7Q==</wsse:Nonce>
<wsu:Created>2014-06-04T14:26:10.199Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>

  <soapenv:Body>
...
</soapenv:Body>
</soapenv:Envelope>

Настройка в Web.config выглядит так:

  <basicHttpBinding>    
<binding name="Contract_savePort" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>

<endpoint address="https://interplat.xxxx.ru/cxf/Contract"
binding="basicHttpBinding" bindingConfiguration="Contract_savePort"
contract="ws_save.save" name="savePort" />

Код вызова такой (в моем Main.asmx.cs):

  saveClient serv = new saveClient("savePort");
  serv.ClientCredentials.UserName.UserName = "XX";
  serv.ClientCredentials.UserName.Password = "XXXX";
  ...
  ContractResponse resp = serv.Contract(req);
Bator
Дата: 05.06.2014 11:12:04
Bator
Дата: 16.06.2014 15:13:45
Bator
Нашел решение:
http://weblog.west-wind.com/posts/2012/Nov/24/WCF-WSSecurity-and-WSE-Nonce-Authentication


Но там есть ошибка:
nonce кодируется в Base64 и потом это nonce-в-Base64 хэшируется вместе с временем и паролем
а нужно хэшировать nonce не в Base64.