public static void AddAuthenticatedHttpClient(this IServiceCollection services, Action <AuthenticatedHttpClientOptions> setupAction = null)
        {
            var options = new AuthenticatedHttpClientOptions();

            setupAction?.Invoke(options);
            services.AddSingleton(options);

            services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            services.TryAddSingleton <AuthenticatedHttpMessageHandler>();

            services.AddTransient <Func <AuthenticatedHttpMessageHandler> >(
                sp => () => sp.GetService <AuthenticatedHttpMessageHandler>());

            services.AddTransient <IAuthenticatedHttpClientFactory, AuthenticatedHttpClientFactory>();
        }
        public AuthenticatedHttpMessageHandler(AuthenticatedHttpClientOptions options,
                                               IHttpContextAccessor httpContextAccessor,
                                               ILogger <AuthenticatedHttpMessageHandler> logger)
        {
            _options             = options ?? throw new ArgumentNullException(nameof(options));
            _httpContextAccessor = httpContextAccessor;
            _logger = logger;

            _tokenClient = new CustomTokenClient(_options.TokenServiceAddress,
                                                 _options.ClientId,
                                                 _options.TokenServiceMessageHandler ?? new HttpClientHandler(),
                                                 AuthenticationStyle.BasicAuthentication);

            _semaphoreSlim   = new SemaphoreSlim(1, 1);
            _resetTokenAfter = null;

            var handler = options.InnerMessageHandler ?? new HttpClientHandler();

            _httpMessageInvoker = new HttpMessageInvoker(handler, true);
        }