2014-01-15 4 views
2

У меня есть привязка WCF, использующая элемент безопасности TransportSecurityBindingElement, но у меня есть постоянные проблемы с точностью времени на сервере как клиента, так и сервера (стороннего).Удалять секунды с момента времени отправки сообщения при отправке подписанного запроса

Как удалить секунды, чтобы сделать отметку времени только с точностью до минуты (мне говорят, что сервер примет это).

Альтернативы идеи у меня были, чтобы обновить системное время перед каждым запросом, однако это предполагает (неправильно), что время сервера является точным. Я также попытался удалить метку времени вообще (это может быть не обязательно), но я получаю System.InvalidOperationException говоря Signing without primary signature requires timestamp.

.Net код для создания защитного элемента: заголовок

Dim msgSecVer As System.ServiceModel.MessageSecurityVersion = ServiceModel.MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10 

    Dim tsbe As TransportSecurityBindingElement = SecurityBindingElement.CreateCertificateOverTransportBindingElement(msgSecVer) 
    tsbe.EnableUnsecuredResponse = True 
    tsbe.SetKeyDerivation(False) 
    tsbe.AllowInsecureTransport = True 
    tsbe.IncludeTimestamp = True 

    'adding clock skew doesn't seem to make any difference? 
    Dim clockSkew As TimeSpan = TimeSpan.FromMinutes(1) 
    tsbe.LocalClientSettings.MaxClockSkew = clockSkew 
    tsbe.LocalServiceSettings.MaxClockSkew = clockSkew 

    Return tsbe 

сообщения, примечания (возможно, избыток) точность временной метки:

POST http://wwwqa.xxxx.com/services/ 
Content-Type: text/xml; charset=utf-8 
VsDebuggerCausalityData: xxxx 
SOAPAction: "" 
Host: wwwqa.xxxx.com 
Content-Length: 2400 
Expect: 100-continue 
Connection: Keep-Alive 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <s:Header> 
     <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>2013-12-04T10:53:13.568Z</u:Created> 
       <u:Expires>2013-12-04T10:58:13.568Z</u:Expires> 
      </u:Timestamp> 
      <o:BinarySecurityToken u:Id="uuid-bc441202-xxxx-xxxx-a176-02f2a61a6002-1" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">....xxxx....</o:BinarySecurityToken> 
      <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
       <SignedInfo> 
        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
        <Reference URI="#_0"> 
         <Transforms> 
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
         </Transforms> 
         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
         <DigestValue>xxxx</DigestValue> 
        </Reference> 
       </SignedInfo> 
       <SignatureValue>xxxx</SignatureValue> 
       <KeyInfo> 
        <o:SecurityTokenReference><o:Reference URI="#uuid-bc441202-xxxx-xxxx-a176-02f2a61a6002-1"/></o:SecurityTokenReference> 
       </KeyInfo> 
      </Signature> 
     </o:Security> 
    </s:Header> 
+1

Вы проверили это? http://msdn.microsoft.com/en-us/library/aa738468.aspx – mostruash

+0

У меня не было, но теперь я добавил часы Skew, но, похоже, это не имеет никакого отношения к метке времени отправленных сообщений. (Я не вижу, чтобы это имело какое-либо значение, я сделал что-то не так? (Обновленный код, о котором идет речь). –

+0

Где это происходит, когда время неверно, и где вы выбрали 'InvalidOperationException', когда вы удаляете временную метку? – Zache

ответ

-1

Если вы используете ваш WCF хост с IIS, можно добавить пользовательский-writteen модуль - это .net DLL - то перехватывает сообщение в IIS, читает, анализирует и удаляет секунд, затем проходит mes sage на ваш сервис WCF.

Как я помню, программа модуля захватывает и читает HTTPContext, позволяя вам изменять сообщение любым удобным вам способом, а вечером добавляя совершенно новые поля в разделы заголовка и тела.

Но этот подход работает только в том случае, если вы используете IIS для управления веб-сервисом или управления им.

Вот ссылка на него: http://www.iis.net/learn/get-started/introduction-to-iis/iis-modules-overview#Querying

+0

Это третья сторона службы, поэтому я не контролирую службу. –

2

Единственный способ я вижу, чтобы это было сделано, чтобы перейти к транспорту-только безопасности в клиенте, а затем добавить заголовок безопасности самостоятельно в custom encoder. Генерирование защитного заголовка включает в себя:

  1. Создание метки времени и ее включение в SOAP (легко).
  2. Создание подписи (жесткий). См. here, а GetSignature прокомментировал наш метод here. Затем нажмите на SOAP.

Для управления SOAP реализуйте кодировщик и метод WriteMessage, в котором у вас есть доступ к сообщению, загрузите его в XmlDocument и обработайте его (например, добавьте заголовки).

+0

Спасибо Ярон, я отдам это. Извините, что я был в отпуске, поэтому пропустил щедрость. –