Проблема истечения срока действия токена WCF - PullRequest
0 голосов
/ 01 сентября 2009

У меня есть служба WCF (FooService), защищенная безопасным разговором. Также есть STS (StsService), который предоставляет токены клиентам, вызывающим FooService. Жетоны хороши на 15 минут. STS изготовлен по индивидуальному заказу (без Женевы). У клиента также есть несколько пользовательских расширений WCF, позволяющих повторно использовать токен в нескольких сервисах в течение всего времени жизни клиента.

Клиент запрашивает токен из STS, когда вызывается «Открыть» на канале FooService. Служба STS работает нормально, выдает токен и предоставляет клиенту действительный RSTR. Клиент получает десериализованный токен (как объект GenericXmlSecurityToken).

Проблема:

Когда клиент получает экземпляр GenericXmlSecurityToken, срок действия НЕ устанавливается правильно. В RSTR есть тег SAML <saml:Conditions>, который имеет действительную дату окончания срока действия, НО, по какой-то причине WCF, похоже, не выполняет синтаксический анализ тега и использует значение NotOnOrAfter.

Вот привязка для STS (на стороне сервера):

    <binding name="stsBinding" receiveTimeout="infinite" 
sendTimeout="infinite">
      <security authenticationMode="SecureConversation" requireSecurityContextCancellation="true">
        <localClientSettings maxClockSkew="23:59:59" />
        <localServiceSettings maxClockSkew="23:59:59" 
inactivityTimeout="00:02:00" />
        <secureConversationBootstrap 
authenticationMode="UserNameForSslNegotiated">
          <localClientSettings maxClockSkew="23:59:59" />
          <localServiceSettings maxClockSkew="23:59:59" />
        </secureConversationBootstrap>
      </security>
      <binaryMessageEncoding />

Вот привязка на стороне клиента:

<binding name="stsBinding"
     closeTimeout="00:02:00"
     openTimeout="00:02:00"
     sendTimeout="00:02:00">
      <security authenticationMode="SecureConversation" requireSecurityContextCancellation="true">
        <localClientSettings maxClockSkew="23:59:59" />
        <localServiceSettings maxClockSkew="23:59:59" 
inactivityTimeout="00:02:00" />
        <secureConversationBootstrap 
authenticationMode="UserNameForSslNegotiated">
          <localClientSettings maxClockSkew="23:59:59" />
      <localServiceSettings maxClockSkew="23:59:59" />
    </secureConversationBootstrap>
  </security>
  <binaryMessageEncoding />
  <tcpTransport maxReceivedMessageSize="2097152"
                maxBufferSize="2097152" maxPendingConnections="10"
                listenBacklog="10" />
</binding>

Я пробовал несколько вещей, чтобы выставить правильную дату истечения срока действия ... но ничто, похоже, не работает. Попробовал внедрить пользовательский сериализатор. Не удалось найти след <saml:Conditions>. Также попытался вызвать STS напрямую, а затем предоставить токен обратно в WCF. Это решение работало, вызывая STS напрямую и десериализовав ответ в действительный SecurityToken, но когда он возвращался обратно в WCF, вызов «Open» на канале истекал через 2 минуты. Нет сообщения об ошибке, ничего в журнале трассировки ...

На стороне клиента токен имеет утверждение SAML. Если я смотрю на: ((GenericXmlSecurityToken)token).TokenXml.InnerXml, это то, что я вижу:

<saml:Conditions 
NotBefore="2009-09-01T19:36:54.669Z" 
NotOnOrAfter="2009-09-01T19:41:54.669Z" 
xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
</saml:Conditions>

Даже пытался пройтись по источнику .NET Framework, но не может сделать это с VS 2008 SP1 на Windows 7. НЕ РАБОТАЕТ! Arg!

Есть идеи?

1 Ответ

0 голосов
/ 01 сентября 2009

Вы можете попробовать настроить ведение журнала сообщений, чтобы проверить, что на самом деле отправляется.

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

...