/// <inheritsdoc /> private Jwk[] GetKeys(JwtHeaderDocument header, string metadataAddress) { if (_disposed) { ThrowHelper.ThrowObjectDisposedException(typeof(JwksHttpKeyProvider)); } var kid = header.Kid; long now = EpochTime.UtcNow; if (_currentJwks != null && _syncAfter > now) { return(_currentJwks.GetKeys(kid)); } if (_syncAfter <= now) { _refreshLock.Wait(); try { var value = _documentRetriever.GetDocument(metadataAddress, CancellationToken.None); var refreshedJwks = Jwks.FromJson(Issuer, value); Jwks.PublishJwksRefreshed(refreshedJwks); _currentJwks = refreshedJwks; _syncAfter = now + AutomaticRefreshInterval; } catch { _syncAfter = now + (AutomaticRefreshInterval < RefreshInterval ? AutomaticRefreshInterval : RefreshInterval); throw; } finally { _refreshLock.Release(); } } if (_currentJwks != null) { return(_currentJwks.GetKeys(kid)); } ThrowHelper.ThrowInvalidOperationException_UnableToObtainKeysException(metadataAddress); return(Array.Empty <Jwk>()); }
/// <inheritsdoc /> protected Jwk[] GetKeys(JwtHeader header, string metadataAddress) { if (_disposed) { ThrowHelper.ThrowObjectDisposedException(GetType()); } var kid = header.Kid; var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); if (_currentKeys != null && _syncAfter > now) { return(_currentKeys.GetKeys(kid)); } if (_syncAfter <= now) { _refreshLock.Wait(); try { var value = _documentRetriever.GetDocument(metadataAddress, CancellationToken.None); _currentKeys = Jwks.FromJson(value); _syncAfter = now + AutomaticRefreshInterval; } catch { _syncAfter = now + (AutomaticRefreshInterval < RefreshInterval ? AutomaticRefreshInterval : RefreshInterval); throw; } finally { _refreshLock.Release(); } } if (_currentKeys != null) { return(_currentKeys.GetKeys(kid)); } ThrowHelper.ThrowInvalidOperationException_UnableToObtainKeysException(metadataAddress); return(Array.Empty <Jwk>()); }