public async Task ProvisionAccessTokenAsync_AssertionTokenIsSigned()
        {
            var claims = new List <Claim> {
                new Claim(Constants.Claims.ISSUER, TestData.ISSUER),
                new Claim(Constants.Claims.TENANT_ID, TestData.TENANT_ID.ToString()),
                new Claim(Constants.Claims.USER_ID, TestData.USER)
            };

            var scopes = new Scope[] { };

            await m_accessTokenProvider
            .ProvisionAccessTokenAsync(claims, scopes)
            .ConfigureAwait(false);

            var publicKeys = (await m_publicKeyDataProvider.GetAllAsync().ConfigureAwait(false)).ToList();

            string expectedKeyId = publicKeys.First().Id.ToString();
            string actualKeyId   = m_actualAssertion.Header.Kid;

            Assert.AreEqual(1, publicKeys.Count);
            Assert.AreEqual(expectedKeyId, actualKeyId);

            AssertClaimEquals(m_actualAssertion, Constants.Claims.ISSUER, TestData.ISSUER);
            AssertClaimEquals(m_actualAssertion, Constants.Claims.TENANT_ID, TestData.TENANT_ID.ToString());
            AssertClaimEquals(m_actualAssertion, Constants.Claims.USER_ID, TestData.USER);
        }
        async Task <IAccessToken> IAccessTokenProvider.ProvisionAccessTokenAsync(
            IEnumerable <Claim> claims,
            IEnumerable <Scope> scopes,
            ICache cache
            )
        {
            if (cache == null)
            {
                cache = new NullCache();
            }

            claims = claims.ToList();
            scopes = scopes.ToList();

            string cacheKey = TokenCacheKeyBuilder.BuildKey(claims, scopes);

            CacheResponse cacheResponse = await cache.GetAsync(cacheKey).SafeAsync();

            if (cacheResponse.Success)
            {
                SecurityToken securityToken = m_tokenHandler.ReadToken(cacheResponse.Value);
                if (securityToken.ValidTo > DateTime.UtcNow.Add(m_tokenRefreshGracePeriod))
                {
                    return(new AccessToken(cacheResponse.Value));
                }
            }

            IAccessToken token =
                await m_accessTokenProvider.ProvisionAccessTokenAsync(claims, scopes).SafeAsync();

            DateTime validTo = m_tokenHandler.ReadToken(token.Token).ValidTo;

            await cache.SetAsync(cacheKey, token.Token, validTo - DateTime.UtcNow).SafeAsync();

            return(token);
        }