protected async Task <FormAuthenticationResponse> ValidateAndGetDataAsync(string code, string redirectUri)
        {
            Dictionary <string, string> tokenRequestParameters = new Dictionary <string, string>()
            {
                { "clientId", Options.ClientId },
                { "clientSecret", Options.ClientSecret },
                { "code", code }
            };

            FormUrlEncodedContent requestContent = new FormUrlEncodedContent(tokenRequestParameters);

            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, Options.UserInformationEndpoint);

            requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            requestMessage.Content = requestContent;
            HttpResponseMessage response = await Backchannel.SendAsync(requestMessage, Context.RequestAborted);

            if (response.IsSuccessStatusCode)
            {
                JObject payload = JObject.Parse(await response.Content.ReadAsStringAsync());
                return(FormAuthenticationResponse.Success(payload));
            }

            string error = "OAuth token endpoint failure: " + await Display(response);

            return(FormAuthenticationResponse.Failed(new Exception(error)));
        }