private async Task <string> GetAccessToken() { await accessTokenSem.WaitAsync(); var tokens = await tokenStorage.Get(); if (!tokens.Expired) { accessTokenSem.Release(); return(tokens.AccessToken); } else if (tokens.HasRefreshToken) { try { var dict = new Dictionary <string, string> { { "client_id", clientId }, { "client_secret", clientSecret }, { "grant_type", "refresh_token" }, { "refresh_token", tokens.RefreshToken } }; var res = await new System.Net.Http.HttpClient().PostAsync($"{authorizationUrl}/connect/token", new FormUrlEncodedContent(dict)); if (res.IsSuccessStatusCode) { var str = await res.Content.ReadAsStringAsync(); var token = JsonConvert.DeserializeObject <TokenResponse>(str); tokens = new StoredTokens() { AccessToken = token.access_token, RefreshToken = token.refresh_token, AccessTokenExpires = DateTime.Now.AddSeconds(token.expires_in) }; await tokenStorage.Store(tokens); return(tokens.AccessToken); } else { throw new UnauthorizedException("Could not redeem refresh token."); } } finally { accessTokenSem.Release(); } } else { accessTokenSem.Release(); throw new UnauthorizedException("No valid access or refresh token configured."); } }