У меня есть служба 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!
Есть идеи?