// TODO: Abstract this properties override pattern into the base class? protected override string BuildChallengeUrl(AuthenticationProperties properties, string redirectUri) { var scope = FormatScope(); var tenantOptions = new MultiTenantGoogleOptionsResolver(Options, siteResolver, siteRepo, multiTenantOptions); string resolvedRedirectUri = tenantOptions.ResolveRedirectUrl(redirectUri); log.LogDebug("resolvedRedirectUri was " + resolvedRedirectUri); var queryStrings = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); queryStrings.Add("response_type", "code"); //queryStrings.Add("client_id", Options.ClientId); //queryStrings.Add("redirect_uri", redirectUri); queryStrings.Add("client_id", tenantOptions.ClientId); queryStrings.Add("redirect_uri", resolvedRedirectUri); AddQueryString(queryStrings, properties, "scope", scope); AddQueryString(queryStrings, properties, "access_type", Options.AccessType); AddQueryString(queryStrings, properties, "approval_prompt"); AddQueryString(queryStrings, properties, "login_hint"); var state = Options.StateDataFormat.Protect(properties); queryStrings.Add("state", state); var authorizationEndpoint = QueryHelpers.AddQueryString(Options.AuthorizationEndpoint, queryStrings); return(authorizationEndpoint); }
protected override async Task <OAuthTokenResponse> ExchangeCodeAsync(string code, string redirectUri) { log.LogDebug("ExchangeCodeAsync called with code " + code + " redirectUri " + redirectUri); //var tokenRequestParameters = new Dictionary<string, string>() //{ // { "client_id", Options.ClientId }, // { "redirect_uri", redirectUri }, // { "client_secret", Options.ClientSecret }, // { "code", code }, // { "grant_type", "authorization_code" }, //}; var currentSite = await GetSite(); var tenantOptions = new MultiTenantGoogleOptionsResolver( Options, currentSite, multiTenantOptions); var tokenRequestParameters = new Dictionary <string, string>() { { "client_id", tenantOptions.ClientId }, { "redirect_uri", tenantOptions.ResolveRedirectUrl(redirectUri) }, { "client_secret", tenantOptions.ClientSecret }, { "code", code }, { "grant_type", "authorization_code" }, }; var requestContent = new FormUrlEncodedContent(tokenRequestParameters); var requestMessage = new HttpRequestMessage(HttpMethod.Post, Options.TokenEndpoint); requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); requestMessage.Content = requestContent; var response = await Backchannel.SendAsync(requestMessage, Context.RequestAborted); response.EnsureSuccessStatusCode(); var payload = JObject.Parse(await response.Content.ReadAsStringAsync()); return(new OAuthTokenResponse(payload)); }