protected virtual async Task <string> GetTokenEndpoint(IdentityClientConfiguration configuration) { //TODO: Can use (configuration.Authority + /connect/token) directly? var tokenEndpointUrlCacheKey = CalculateDiscoveryDocumentCacheKey(configuration); var discoveryDocumentCacheItem = await DiscoveryDocumentCache.GetAsync(tokenEndpointUrlCacheKey); if (discoveryDocumentCacheItem == null) { var discoveryResponse = await GetDiscoveryResponse(configuration); if (discoveryResponse.IsError) { throw new AbpException($"Could not retrieve the OpenId Connect discovery document! " + $"ErrorType: {discoveryResponse.ErrorType}. Error: {discoveryResponse.Error}"); } discoveryDocumentCacheItem = new IdentityModelDiscoveryDocumentCacheItem(discoveryResponse.TokenEndpoint); await DiscoveryDocumentCache.SetAsync(tokenEndpointUrlCacheKey, discoveryDocumentCacheItem, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(configuration.CacheAbsoluteExpiration) }); } return(discoveryDocumentCacheItem.TokenEndpoint); }
protected virtual async Task <IdentityModelDiscoveryDocumentCacheItem> GetDiscoveryResponse(IdentityClientConfiguration configuration) { var tokenEndpointUrlCacheKey = CalculateDiscoveryDocumentCacheKey(configuration); var discoveryDocumentCacheItem = await DiscoveryDocumentCache.GetAsync(tokenEndpointUrlCacheKey); if (discoveryDocumentCacheItem == null) { DiscoveryDocumentResponse discoveryResponse; using (var httpClient = HttpClientFactory.CreateClient(HttpClientName)) { var request = new DiscoveryDocumentRequest { Address = configuration.Authority, Policy = { RequireHttps = configuration.RequireHttps } }; IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage?.Invoke(request); discoveryResponse = await httpClient.GetDiscoveryDocumentAsync(request); } if (discoveryResponse.IsError) { throw new AbpException($"Could not retrieve the OpenId Connect discovery document! " + $"ErrorType: {discoveryResponse.ErrorType}. Error: {discoveryResponse.Error}"); } discoveryDocumentCacheItem = new IdentityModelDiscoveryDocumentCacheItem(discoveryResponse.TokenEndpoint, discoveryResponse.DeviceAuthorizationEndpoint); await DiscoveryDocumentCache.SetAsync(tokenEndpointUrlCacheKey, discoveryDocumentCacheItem, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(configuration.CacheAbsoluteExpiration) }); } return(discoveryDocumentCacheItem); }
protected virtual string CalculateDiscoveryDocumentCacheKey(IdentityClientConfiguration configuration) { return(IdentityModelDiscoveryDocumentCacheItem.CalculateCacheKey(configuration)); }