private static TokenIntrospectionRequest CreateTokenIntrospectionRequest(
            string token,
            HttpContext context,
            AuthenticationScheme scheme,
            OAuth2IntrospectionEvents events,
            OAuth2IntrospectionOptions options)
        {
            if (options.ClientSecret == null && options.ClientAssertionExpirationTime <= DateTime.UtcNow)
            {
                lock (options.AssertionUpdateLockObj)
                {
                    if (options.ClientAssertionExpirationTime <= DateTime.UtcNow)
                    {
                        var updateClientAssertionContext = new UpdateClientAssertionContext(context, scheme, options)
                        {
                            ClientAssertion = options.ClientAssertion ?? new ClientAssertion()
                        };

                        events.UpdateClientAssertion(updateClientAssertionContext);

                        options.ClientAssertion = updateClientAssertionContext.ClientAssertion;
                        options.ClientAssertionExpirationTime =
                            updateClientAssertionContext.ClientAssertionExpirationTime;
                    }
                }
            }

            return(new TokenIntrospectionRequest
            {
                Token = token,
                TokenTypeHint = options.TokenTypeHint,
                Address = options.IntrospectionEndpoint,
                ClientId = options.ClientId,
                ClientSecret = options.ClientSecret,
                ClientAssertion = options.ClientAssertion ?? new ClientAssertion(),
                ClientCredentialStyle = options.ClientCredentialStyle,
                AuthorizationHeaderStyle = options.AuthorizationHeaderStyle,
            });
        }
 /// <summary>
 /// Invoked when client assertion need to be updated.
 /// </summary>
 public virtual Task UpdateClientAssertion(UpdateClientAssertionContext context) => OnUpdateClientAssertion(context);