Example #1
0
        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.");
            }
        }