22// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33
44using FluentAssertions ;
5+ using IdentityModel ;
56using IdentityModel . AspNetCore . OAuth2Introspection ;
67using IdentityModel . Client ;
8+ using Microsoft . AspNetCore . TestHost ;
9+ using Microsoft . Extensions . Caching . Distributed ;
10+ using Microsoft . Extensions . DependencyInjection ;
711using Newtonsoft . Json ;
812using System ;
913using System . Collections . Generic ;
1014using System . Net ;
15+ using System . Security . Claims ;
1116using System . Threading . Tasks ;
1217using Tests . Util ;
1318using Xunit ;
@@ -207,15 +212,47 @@ public async Task ActiveToken_With_SavedToken_And_Caching()
207212 var expectedToken = "expected_token" ;
208213 var handler = new IntrospectionEndpointHandler ( IntrospectionEndpointHandler . Behavior . Active , TimeSpan . FromHours ( 1 ) ) ;
209214
210- var client = PipelineFactory . CreateClient ( ( o ) =>
215+ var server = PipelineFactory . CreateServer ( ( o ) =>
211216 {
212217 _options ( o ) ;
213218
214219 o . SaveToken = true ;
215220 o . EnableCaching = true ;
216221 o . CacheDuration = TimeSpan . FromMinutes ( 10 ) ;
217222 } , handler , true ) ;
223+ var client = server . CreateClient ( ) ;
224+ client . SetBearerToken ( expectedToken ) ;
225+
226+ var firstResponse = await client . GetAsync ( "http://test" ) ;
227+ firstResponse . StatusCode . Should ( ) . Be ( HttpStatusCode . OK ) ;
228+
229+ var secondResponse = await client . GetAsync ( "http://test" ) ;
230+ secondResponse . StatusCode . Should ( ) . Be ( HttpStatusCode . OK ) ;
231+
232+ var responseDataStr = await secondResponse . Content . ReadAsStringAsync ( ) ;
233+ var responseData = JsonConvert . DeserializeObject < Dictionary < string , string > > ( responseDataStr ) ;
234+
235+ responseData . Should ( ) . Contain ( "token" , expectedToken ) ;
236+ AssertCacheItemExists ( server , string . Empty , expectedToken ) ;
237+ }
218238
239+ [ Fact ]
240+ public async Task ActiveToken_With_SavedToken_And_Caching_With_Cache_Key_Prefix ( )
241+ {
242+ var expectedToken = "expected_token" ;
243+ var cacheKeyPrefix = "KeyPrefix" ;
244+ var handler = new IntrospectionEndpointHandler ( IntrospectionEndpointHandler . Behavior . Active , TimeSpan . FromHours ( 1 ) ) ;
245+
246+ var server = PipelineFactory . CreateServer ( ( o ) =>
247+ {
248+ _options ( o ) ;
249+
250+ o . SaveToken = true ;
251+ o . EnableCaching = true ;
252+ o . CacheKeyPrefix = cacheKeyPrefix ;
253+ o . CacheDuration = TimeSpan . FromMinutes ( 10 ) ;
254+ } , handler , true ) ;
255+ var client = server . CreateClient ( ) ;
219256 client . SetBearerToken ( expectedToken ) ;
220257
221258 var firstResponse = await client . GetAsync ( "http://test" ) ;
@@ -228,6 +265,7 @@ public async Task ActiveToken_With_SavedToken_And_Caching()
228265 var responseData = JsonConvert . DeserializeObject < Dictionary < string , string > > ( responseDataStr ) ;
229266
230267 responseData . Should ( ) . Contain ( "token" , expectedToken ) ;
268+ AssertCacheItemExists ( server , cacheKeyPrefix , expectedToken ) ;
231269 }
232270
233271 [ Fact ]
@@ -236,15 +274,15 @@ public async Task Repeated_active_token_with_caching_enabled_should_hit_cache()
236274 var expectedToken = "expected_token" ;
237275 var handler = new IntrospectionEndpointHandler ( IntrospectionEndpointHandler . Behavior . Active , TimeSpan . FromHours ( 1 ) ) ;
238276
239- var client = PipelineFactory . CreateClient ( ( o ) =>
277+ var server = PipelineFactory . CreateServer ( ( o ) =>
240278 {
241279 _options ( o ) ;
242-
280+
243281 o . SaveToken = true ;
244282 o . EnableCaching = true ;
245283 o . CacheDuration = TimeSpan . FromMinutes ( 10 ) ;
246284 } , handler , true ) ;
247-
285+ var client = server . CreateClient ( ) ;
248286 client . SetBearerToken ( expectedToken ) ;
249287
250288 var firstResponse = await client . GetAsync ( "http://test" ) ;
@@ -255,6 +293,7 @@ public async Task Repeated_active_token_with_caching_enabled_should_hit_cache()
255293 handler . SentIntrospectionRequest = false ;
256294 var secondResponse = await client . GetAsync ( "http://test" ) ;
257295 handler . SentIntrospectionRequest . Should ( ) . BeFalse ( ) ;
296+ AssertCacheItemExists ( server , string . Empty , expectedToken ) ;
258297 }
259298
260299 [ Fact ]
@@ -263,15 +302,15 @@ public async Task Repeated_inactive_token_with_caching_enabled_should_hit_cache(
263302 var expectedToken = "expected_token" ;
264303 var handler = new IntrospectionEndpointHandler ( IntrospectionEndpointHandler . Behavior . Inactive ) ;
265304
266- var client = PipelineFactory . CreateClient ( ( o ) =>
305+ var server = PipelineFactory . CreateServer ( ( o ) =>
267306 {
268307 _options ( o ) ;
269308
270309 o . SaveToken = true ;
271310 o . EnableCaching = true ;
272311 o . CacheDuration = TimeSpan . FromMinutes ( 10 ) ;
273312 } , handler , true ) ;
274-
313+ var client = server . CreateClient ( ) ;
275314 client . SetBearerToken ( expectedToken ) ;
276315
277316 var firstResponse = await client . GetAsync ( "http://test" ) ;
@@ -283,6 +322,7 @@ public async Task Repeated_inactive_token_with_caching_enabled_should_hit_cache(
283322 var secondResponse = await client . GetAsync ( "http://test" ) ;
284323 secondResponse . StatusCode . Should ( ) . Be ( HttpStatusCode . Unauthorized ) ;
285324 handler . SentIntrospectionRequest . Should ( ) . BeFalse ( ) ;
325+ AssertCacheItemExists ( server , string . Empty , expectedToken ) ;
286326 }
287327
288328 [ Fact ]
@@ -300,5 +340,13 @@ public async Task ActiveToken_With_Discovery_Unavailable_On_First_Request()
300340 var result = await client . GetAsync ( "http://test" ) ;
301341 result . StatusCode . Should ( ) . Be ( HttpStatusCode . OK ) ;
302342 }
343+
344+ private void AssertCacheItemExists ( TestServer testServer , string cacheKeyPrefix , string token )
345+ {
346+ var cache = testServer . Services . GetService < IDistributedCache > ( ) ;
347+ var cacheItem = cache . GetString ( $ "{ cacheKeyPrefix } { token . ToSha256 ( ) } ") ;
348+
349+ cacheItem . Should ( ) . NotBeNullOrEmpty ( ) ;
350+ }
303351 }
304352}
0 commit comments