Пример #1
0
        public async Task <TokenExchangeResult> ExchangeTokenAsync(string referenceToken, ReferenceTokenExchangeOptions options)
        {
            _logger.LogInformation("Checking cache for the presence of token");
            var cachedToken = _cache.FindToken(referenceToken);

            if (cachedToken == null)
            {
                _logger.LogInformation("Token not found in cache");
                var tokenResult = await PerformOnlineTokenExchange(referenceToken, options);

                AddTokenToCache(tokenResult);
                return(tokenResult);
            }

            if (cachedToken.AccessTokenExpiryTime < DateTimeOffset.UtcNow)
            {
                _logger.LogInformation("Expired token found in cache");
                _cache.RemoveToken(cachedToken);

                var tokenResult = await PerformOnlineTokenExchange(referenceToken, options);

                AddTokenToCache(tokenResult);
                return(tokenResult);
            }

            _logger.LogInformation("Token found in cache, returning token");
            return(cachedToken);
        }
Пример #2
0
 private async Task <TokenExchangeResult> PerformOnlineTokenExchange(string referenceToken, ReferenceTokenExchangeOptions options)
 {
     return(await _tokenExchangeService.ExchangeTokenAsync(referenceToken, options));
 }
        public async Task <TokenExchangeResult> ExchangeTokenAsync(string referenceToken, ReferenceTokenExchangeOptions options)
        {
            if (referenceToken == null)
            {
                referenceToken = string.Empty;
            }

            var payload = new
            {
                token = referenceToken
            };

            var identityServer = await DiscoverIdentityServerAsync(options.IdentityServerRootUrl, options.RequireHttpsEndpoints, options.AdditionalEndpointBaseAddresses);

            var client = new TokenClient(identityServer.TokenEndpoint, options.ClientId, options.ClientSecret, options.HttpHandler);

            _logger.LogInformation($"Requesting token exchange from Identity Server: {identityServer.TokenEndpoint}");
            var tokenResponse = await client.RequestCustomGrantAsync(options.GrantType, options.Scope, payload);

            if (tokenResponse.IsError)
            {
                _logger.LogWarning($"An error occured during reference token exchange: {tokenResponse.Error}");
            }

            var result = new TokenExchangeResult
            {
                ReferenceToken        = referenceToken,
                AccessToken           = tokenResponse.AccessToken,
                AccessTokenExpiryTime = DateTimeOffset.UtcNow.AddSeconds(tokenResponse.ExpiresIn)
            };

            _logger.LogInformation("Token exchange with Identity Server completed successfully");
            return(result);
        }