2009-09-01 5 views
0

J'ai un service WCF (FooService) protégé par Secure Conversation. Avoir également un STS (StsService) qui fournit des jetons aux clients appelant FooService. Les jetons sont bons pendant 15 minutes. Le STS est custom-build (pas de Genève). Le client dispose également de certaines extensions WCF personnalisées pour permettre la réutilisation du jeton sur plusieurs services pendant la durée de vie du client.Problème d'expiration de jeton WCF STS

Le client demande un jeton du STS lorsque "Open" sur le canal de FooService est appelé. Le STS fonctionne correctement, émet le jeton et fournit un RSTR valide au client. Le client reçoit le jeton dé-sérialisé (en tant qu'objet GenericXmlSecurityToken).

Problème:

Lorsque le client reçoit l'instance GenericXmlSecurityToken, la date d'expiration est pas réglée correctement. Dans le RSTR, il existe une balise SAML <saml:Conditions> qui a la date d'expiration valide MAIS, pour une raison quelconque, WCF ne semble pas analyser le tag et utiliser la valeur de NotOnOrAfter.

est ici la liaison pour le STS (côté serveur):

<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 /> 

Voici le côté client de liaison:

<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> 

J'ai essayé plusieurs choses pour obtenir la date d'expiration correcte à montrer ... mais rien ne semble fonctionner. J'ai essayé d'implémenter un sérialiseur personnalisé. Impossible de trouver la trace de <saml:Conditions>. Également essayé d'appeler le STS directement, puis de fournir le jeton à WCF. Cette solution fonctionnait, appelant le STS directement et désérialisant la réponse dans un SecurityToken valide, mais quand il est retourné à WCF, l'appel "Open" sur le canal expire après 2 minutes. Aucun message d'erreur, rien dans le journal de trace ...

Du côté client, le jeton a l'assertion SAML. Si je regarde: ((GenericXmlSecurityToken)token).TokenXml.InnerXml, voici ce que je vois:

<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> 

même essayé la source pas à pas dans .NET Framework, mais ne peut pas le faire avec VS 2008 SP1 sous Windows 7. NE FONCTIONNE PAS! Arg!

Des idées?

Répondre

0

Vous pouvez essayer de configurer la journalisation des messages pour vérifier ce qui est réellement envoyé.

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

+0

Oui, j'ai configuré la journalisation des messages. Le message contient l'élément valide avec un attribut NotValidOnOrAfter valide. Il est simplement ignoré du côté client. – Doanair

+0

Cela peut-il être quelque chose à voir avec le format du datetime? Ce –

+0

est ce que je pensais, mais je tenté d'analyser manuellement et en DateTime parse très bien ... Voici ce que le client reçoit du serveur: ((GenericXmlSecurityToken) jeton) .TokenXml.InnerXml = = Doanair

Questions connexes