[ 
https://issues.apache.org/jira/browse/CXF-5975?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14125817#comment-14125817
 ] 

Willem Salembier commented on CXF-5975:
---------------------------------------

Race condition is perhaps bad wording. The situation with some clients is the 
following.

token valid from 0:00:00->0:59:59

0:59:59: CXF verifies token expiration on client side and determines its valid
-- network traffic / wire time --
1:00:00: token arrives on server and server rejects it because token is expired.

To handle this situation:
1) Either the server should be lax and accept tokens that expired in the last x 
seconds
2) Either the client should be defensive and don't use a token that will expire 
within x seconds
3) Either the client should on receiving a soap fault, automically renew the 
token and resubmit the request

In our situation we cannot change the server (option 1) and option 2 and 3 are 
not currently not supported in CXF thus the only thing we can do is implement 
the retry in our client code explicitely. 

I'd prefer a simple configuration feature of the CXF token cache to instruct 
that tokens expiring within x seconds must be renewed by force (eg like in the 
example above)

> SecurityToken::isExpired: add clock skew option
> -----------------------------------------------
>
>                 Key: CXF-5975
>                 URL: https://issues.apache.org/jira/browse/CXF-5975
>             Project: CXF
>          Issue Type: Improvement
>    Affects Versions: 2.7.10, 2.7.12
>            Reporter: Willem Salembier
>             Fix For: 2.7.13
>
>
> We notice race conditions with some of our clients when CXF verifies if 
> SecurityTokens cached locally are still valid or expired. One reason could be 
> clock desynchronization, another reason is that while the token was still 
> valid at the moment of request construction, it isn't when the SOAP message 
> arrives on the server (1s difference suffices).
> Is it possible to add a clock skew option to 
> org.apache.cxf.ws.security.tokenstore.SecurityToken.isExpired() or 
> org.apache.cxf.ws.security.trust.STSClient to compensate clock differences 
> between client and server.
> Our current workaround is to subclass the STSClient class.
> {code}
> public class STSClockSkewClient extends STSClient {
>     private static final int CLOCK_SKEW = 15 * 1000 /* 15s */;
>     public STSClockSkewClient(Bus b) {
>         super(b);
>     }
>     @Override
>     protected SecurityToken createSecurityToken(Element el, byte[] 
> requestorEntropy) throws WSSecurityException {
>         SecurityToken securityToken = super.createSecurityToken(el, 
> requestorEntropy);
>         Date expires = securityToken.getExpires();
>         if (expires != null) {
>             securityToken.setExpires(new Date(expires.getTime() - 
> CLOCK_SKEW));
>         }
>         return securityToken;
>     }
> }
> {code}
> A possible workaround is to handle this in the STS and set Lifetime>Expires 
> in the RSTR response not equal but some time before the end of the SAML 
> token, but most of the times the STS clients have no control over the STS 
> service and cannot ask the service provider to make this change.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to