13
13
using Microsoft . IdentityModel . Protocols ;
14
14
using Microsoft . IdentityModel . Protocols . OpenIdConnect ;
15
15
using Microsoft . IdentityModel . Tokens ;
16
+ using static Microsoft . IdentityModel . Validators . AadIssuerValidator ;
16
17
17
18
namespace Microsoft . IdentityModel . Validators
18
19
{
@@ -23,8 +24,12 @@ public class AadIssuerValidator
23
24
{
24
25
private static readonly TimeSpan LastKnownGoodConfigurationLifetime = new TimeSpan ( 0 , 24 , 0 , 0 ) ;
25
26
27
+ internal const string V11EndpointSuffix = "/v1.1" ;
28
+ internal const string V11EndpointSuffixWithTrailingSlash = $ "{ V11EndpointSuffix } /";
29
+
26
30
internal const string V2EndpointSuffix = "/v2.0" ;
27
31
internal const string V2EndpointSuffixWithTrailingSlash = $ "{ V2EndpointSuffix } /";
32
+
28
33
internal const string TenantIdTemplate = "{tenantid}" ;
29
34
30
35
private Func < string , BaseConfigurationManager > _configurationManagerProvider ;
@@ -35,7 +40,8 @@ internal AadIssuerValidator(
35
40
{
36
41
HttpClient = httpClient ;
37
42
AadAuthority = aadAuthority . TrimEnd ( '/' ) ;
38
- IsV2Authority = aadAuthority . Contains ( V2EndpointSuffix ) ;
43
+ AadAuthorityVersion = GetProtocolVersion ( AadAuthority ) ;
44
+ SetupAuthorities ( AadAuthority , AadAuthorityVersion ) ;
39
45
}
40
46
41
47
internal AadIssuerValidator (
@@ -51,11 +57,12 @@ internal AadIssuerValidator(
51
57
}
52
58
53
59
private HttpClient HttpClient { get ; }
54
- private string _aadAuthorityV1 ;
55
- private string _aadAuthorityV2 ;
60
+
56
61
private BaseConfigurationManager _configurationManagerV1 ;
62
+ private BaseConfigurationManager _configurationManagerV11 ;
57
63
private BaseConfigurationManager _configurationManagerV2 ;
58
64
private IssuerLastKnownGood _issuerLKGV1 ;
65
+ private IssuerLastKnownGood _issuerLKGV11 ;
59
66
private IssuerLastKnownGood _issuerLKGV2 ;
60
67
61
68
internal BaseConfigurationManager ConfigurationManagerV1
@@ -74,6 +81,22 @@ internal BaseConfigurationManager ConfigurationManagerV1
74
81
}
75
82
}
76
83
84
+ internal BaseConfigurationManager ConfigurationManagerV11
85
+ {
86
+ get
87
+ {
88
+ if ( _configurationManagerV11 == null )
89
+ _configurationManagerV11 = CreateConfigManager ( AadAuthorityV11 ) ;
90
+
91
+ return _configurationManagerV11 ;
92
+ }
93
+
94
+ set
95
+ {
96
+ _configurationManagerV11 = value ;
97
+ }
98
+ }
99
+
77
100
internal BaseConfigurationManager ConfigurationManagerV2
78
101
{
79
102
get
@@ -92,30 +115,54 @@ internal BaseConfigurationManager ConfigurationManagerV2
92
115
93
116
internal string AadAuthorityV1
94
117
{
95
- get
96
- {
97
- if ( _aadAuthorityV1 == null )
98
- _aadAuthorityV1 = IsV2Authority ? CreateV1Authority ( AadAuthority ) : AadAuthority ;
118
+ get ;
119
+ private set ;
120
+ }
99
121
100
- return _aadAuthorityV1 ;
101
- }
122
+ internal string AadAuthorityV11
123
+ {
124
+ get ;
125
+ private set ;
102
126
}
103
127
104
128
internal string AadAuthorityV2
105
129
{
106
- get
107
- {
108
- if ( _aadAuthorityV2 == null )
109
- _aadAuthorityV2 = IsV2Authority ? AadAuthority : AadAuthority + V2EndpointSuffix ;
130
+ get ;
131
+ private set ;
132
+ }
110
133
111
- return _aadAuthorityV2 ;
134
+ private void SetupAuthorities ( string aadAuthority , ProtocolVersion version )
135
+ {
136
+ switch ( version )
137
+ {
138
+ case ProtocolVersion . V1 :
139
+ AadAuthorityV1 = aadAuthority ;
140
+ AadAuthorityV11 = AadAuthorityV1 + V11EndpointSuffix ;
141
+ AadAuthorityV2 = AadAuthorityV1 + V2EndpointSuffix ;
142
+ break ;
143
+
144
+ case ProtocolVersion . V11 :
145
+ AadAuthorityV1 = CreateV1Authority ( AadAuthority , V11EndpointSuffix ) ;
146
+ AadAuthorityV11 = aadAuthority ;
147
+ AadAuthorityV2 = AadAuthorityV1 + V2EndpointSuffix ;
148
+ break ;
149
+
150
+ case ProtocolVersion . V2 :
151
+ AadAuthorityV1 = CreateV1Authority ( AadAuthority ) ;
152
+ AadAuthorityV11 = AadAuthorityV1 + V11EndpointSuffix ;
153
+ AadAuthorityV2 = aadAuthority ;
154
+ break ;
155
+
156
+ default :
157
+ throw new InvalidOperationException ( "Unsupported protocol version." ) ;
112
158
}
113
159
}
114
160
115
161
internal string AadIssuerV1 { get ; set ; }
116
162
internal string AadIssuerV2 { get ; set ; }
117
163
internal string AadAuthority { get ; set ; }
118
- internal bool IsV2Authority { get ; set ; }
164
+ internal ProtocolVersion AadAuthorityVersion { get ; set ; }
165
+
119
166
internal static readonly IDictionary < string , AadIssuerValidator > s_issuerValidators = new ConcurrentDictionary < string , AadIssuerValidator > ( ) ;
120
167
121
168
/// <summary>
@@ -196,14 +243,14 @@ internal async ValueTask<string> ValidateAsync(
196
243
197
244
try
198
245
{
199
- var isV2Issuer = IsV2Issuer ( securityToken ) ;
200
- var effectiveConfigurationManager = GetEffectiveConfigurationManager ( isV2Issuer ) ;
246
+ var issuerVersion = GetTokenIssuerVersion ( securityToken ) ;
247
+ var effectiveConfigurationManager = GetEffectiveConfigurationManager ( issuerVersion ) ;
201
248
202
249
string aadIssuer = null ;
203
250
if ( validationParameters . ValidateWithLKG )
204
251
{
205
252
// returns null if LKG issuer expired
206
- aadIssuer = GetEffectiveLKGIssuer ( isV2Issuer ) ;
253
+ aadIssuer = GetEffectiveLKGIssuer ( issuerVersion ) ;
207
254
}
208
255
else
209
256
{
@@ -217,7 +264,7 @@ internal async ValueTask<string> ValidateAsync(
217
264
218
265
// The original LKG assignment behavior for previous self-state management.
219
266
if ( isIssuerValid && ! validationParameters . ValidateWithLKG )
220
- SetEffectiveLKGIssuer ( aadIssuer , isV2Issuer , effectiveConfigurationManager . LastKnownGoodLifetime ) ;
267
+ SetEffectiveLKGIssuer ( aadIssuer , issuerVersion , effectiveConfigurationManager . LastKnownGoodLifetime ) ;
221
268
222
269
if ( isIssuerValid )
223
270
return issuer ;
@@ -305,12 +352,13 @@ internal static AadIssuerValidator GetAadIssuerValidator(string aadAuthority, Ht
305
352
return s_issuerValidators [ aadAuthority ] ;
306
353
}
307
354
308
- private static string CreateV1Authority ( string aadV2Authority )
355
+
356
+ private static string CreateV1Authority ( string aadV2Authority , string suffixToReplace = V2EndpointSuffix )
309
357
{
310
- if ( aadV2Authority . Contains ( AadIssuerValidatorConstants . Organizations ) )
311
- return aadV2Authority . Replace ( $ "{ AadIssuerValidatorConstants . Organizations } { V2EndpointSuffix } ", AadIssuerValidatorConstants . Common ) ;
358
+ if ( suffixToReplace == V2EndpointSuffix && aadV2Authority . Contains ( AadIssuerValidatorConstants . Organizations ) )
359
+ return aadV2Authority . Replace ( $ "{ AadIssuerValidatorConstants . Organizations } { suffixToReplace } ", AadIssuerValidatorConstants . Common ) ;
312
360
313
- return aadV2Authority . Replace ( V2EndpointSuffix , string . Empty ) ;
361
+ return aadV2Authority . Replace ( suffixToReplace , string . Empty ) ;
314
362
}
315
363
316
364
private ConfigurationManager < OpenIdConnectConfiguration > CreateConfigManager (
@@ -350,23 +398,48 @@ private static bool IsValidIssuer(string validIssuerTemplate, string tenantId, s
350
398
}
351
399
}
352
400
353
- private void SetEffectiveLKGIssuer ( string aadIssuer , bool isV2Issuer , TimeSpan lastKnownGoodLifetime )
401
+ private void SetEffectiveLKGIssuer ( string aadIssuer , ProtocolVersion protocolVersion , TimeSpan lastKnownGoodLifetime )
354
402
{
355
403
var issuerLKG = new IssuerLastKnownGood
356
404
{
357
405
Issuer = aadIssuer ,
358
406
LastKnownGoodLifetime = lastKnownGoodLifetime
359
407
} ;
360
408
361
- if ( isV2Issuer )
362
- _issuerLKGV2 = issuerLKG ;
363
- else
364
- _issuerLKGV1 = issuerLKG ;
409
+ switch ( protocolVersion )
410
+ {
411
+ case ProtocolVersion . V1 :
412
+ _issuerLKGV1 = issuerLKG ;
413
+ break ;
414
+
415
+ case ProtocolVersion . V11 :
416
+ _issuerLKGV11 = issuerLKG ;
417
+ break ;
418
+
419
+ case ProtocolVersion . V2 :
420
+ _issuerLKGV2 = issuerLKG ;
421
+ break ;
422
+ }
365
423
}
366
424
367
- private string GetEffectiveLKGIssuer ( bool isV2Issuer )
425
+ private string GetEffectiveLKGIssuer ( ProtocolVersion protocolVersion )
368
426
{
369
- var effectiveLKGIssuer = isV2Issuer ? _issuerLKGV2 : _issuerLKGV1 ;
427
+ IssuerLastKnownGood effectiveLKGIssuer = null ;
428
+ switch ( protocolVersion )
429
+ {
430
+ case ProtocolVersion . V1 :
431
+ effectiveLKGIssuer = _issuerLKGV1 ;
432
+ break ;
433
+
434
+ case ProtocolVersion . V11 :
435
+ effectiveLKGIssuer = _issuerLKGV11 ;
436
+ break ;
437
+
438
+ case ProtocolVersion . V2 :
439
+ effectiveLKGIssuer = _issuerLKGV2 ;
440
+ break ;
441
+ }
442
+
370
443
if ( effectiveLKGIssuer != null && effectiveLKGIssuer . IsValid )
371
444
{
372
445
return effectiveLKGIssuer . Issuer ;
@@ -375,25 +448,80 @@ private string GetEffectiveLKGIssuer(bool isV2Issuer)
375
448
return null ;
376
449
}
377
450
378
- private static bool IsV2Issuer ( SecurityToken securityToken )
451
+ private static ProtocolVersion GetTokenIssuerVersion ( SecurityToken securityToken )
379
452
{
380
- return securityToken . Issuer . EndsWith ( V2EndpointSuffixWithTrailingSlash , StringComparison . OrdinalIgnoreCase ) ||
381
- securityToken . Issuer . EndsWith ( V2EndpointSuffix , StringComparison . OrdinalIgnoreCase ) ;
453
+ if ( securityToken . Issuer . EndsWith ( V2EndpointSuffixWithTrailingSlash , StringComparison . OrdinalIgnoreCase ) ||
454
+ securityToken . Issuer . EndsWith ( V2EndpointSuffix , StringComparison . OrdinalIgnoreCase ) )
455
+ return ProtocolVersion . V2 ;
456
+
457
+ if ( securityToken . Issuer . EndsWith ( V11EndpointSuffixWithTrailingSlash , StringComparison . OrdinalIgnoreCase ) ||
458
+ securityToken . Issuer . EndsWith ( V11EndpointSuffix , StringComparison . OrdinalIgnoreCase ) )
459
+ return ProtocolVersion . V11 ;
460
+
461
+ return ProtocolVersion . V1 ;
382
462
}
383
463
384
- private BaseConfigurationManager GetEffectiveConfigurationManager ( bool isV2Issuer )
464
+ private BaseConfigurationManager GetEffectiveConfigurationManager ( ProtocolVersion protocolVersion )
385
465
{
386
466
if ( _configurationManagerProvider != null )
387
467
{
388
- var aadAuthority = isV2Issuer ? AadAuthorityV2 : AadAuthorityV1 ;
389
- var configurationManager = _configurationManagerProvider ( aadAuthority ) ;
468
+ string aadAuthority = GetAuthority ( protocolVersion ) ;
469
+
390
470
471
+ var configurationManager = _configurationManagerProvider ( aadAuthority ) ;
391
472
if ( configurationManager != null )
392
473
return configurationManager ;
393
474
}
394
475
395
- // If no provider or provider returned null, fallback to previous strategy
396
- return isV2Issuer ? ConfigurationManagerV2 : ConfigurationManagerV1 ;
476
+ // If no provider or provider returned null, fallback to previous strategy
477
+ return GetConfigurationManager ( protocolVersion ) ;
478
+ }
479
+
480
+ private BaseConfigurationManager GetConfigurationManager ( ProtocolVersion protocolVersion )
481
+ {
482
+ switch ( protocolVersion )
483
+ {
484
+ case ProtocolVersion . V1 :
485
+ return ConfigurationManagerV1 ;
486
+
487
+ case ProtocolVersion . V11 :
488
+ return ConfigurationManagerV11 ;
489
+
490
+ case ProtocolVersion . V2 :
491
+ return ConfigurationManagerV2 ;
492
+
493
+ default :
494
+ return ConfigurationManagerV1 ;
495
+ }
496
+ }
497
+
498
+ private string GetAuthority ( ProtocolVersion protocolVersion )
499
+ {
500
+ switch ( protocolVersion )
501
+ {
502
+ case ProtocolVersion . V1 :
503
+ return AadAuthorityV1 ;
504
+
505
+ case ProtocolVersion . V11 :
506
+ return AadAuthorityV11 ;
507
+
508
+ case ProtocolVersion . V2 :
509
+ return AadAuthorityV2 ;
510
+
511
+ default :
512
+ return AadAuthorityV1 ;
513
+ }
514
+ }
515
+
516
+ private static ProtocolVersion GetProtocolVersion ( string aadAuthority )
517
+ {
518
+ if ( aadAuthority . Contains ( V2EndpointSuffix ) )
519
+ return ProtocolVersion . V2 ;
520
+
521
+ if ( aadAuthority . Contains ( V11EndpointSuffix ) )
522
+ return ProtocolVersion . V11 ;
523
+
524
+ return ProtocolVersion . V1 ;
397
525
}
398
526
399
527
private static async Task < BaseConfiguration > GetBaseConfiguration ( BaseConfigurationManager configurationManager , TokenValidationParameters validationParameters )
0 commit comments