5
5
using System . Collections . Generic ;
6
6
using System . Text . Json ;
7
7
using Microsoft . IdentityModel . Logging ;
8
+ using Microsoft . IdentityModel . Tokens ;
8
9
using Microsoft . IdentityModel . Tokens . Json ;
9
10
10
11
namespace Microsoft . IdentityModel . JsonWebTokens
@@ -41,41 +42,7 @@ internal JsonClaimSet CreateHeaderClaimSet(ReadOnlySpan<byte> byteSpan)
41
42
{
42
43
if ( reader . TokenType == JsonTokenType . PropertyName )
43
44
{
44
- if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Alg ) )
45
- {
46
- _alg = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Alg , ClassName , true ) ;
47
- claims [ JwtHeaderParameterNames . Alg ] = _alg ;
48
- }
49
- else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Cty ) )
50
- {
51
- _cty = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Cty , ClassName , true ) ;
52
- claims [ JwtHeaderParameterNames . Cty ] = _cty ;
53
- }
54
- else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Kid ) )
55
- {
56
- _kid = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Kid , ClassName , true ) ;
57
- claims [ JwtHeaderParameterNames . Kid ] = _kid ;
58
- }
59
- else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Typ ) )
60
- {
61
- _typ = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Typ , ClassName , true ) ;
62
- claims [ JwtHeaderParameterNames . Typ ] = _typ ;
63
- }
64
- else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . X5t ) )
65
- {
66
- _x5t = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . X5t , ClassName , true ) ;
67
- claims [ JwtHeaderParameterNames . X5t ] = _x5t ;
68
- }
69
- else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Zip ) )
70
- {
71
- _zip = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Zip , ClassName , true ) ;
72
- claims [ JwtHeaderParameterNames . Zip ] = _zip ;
73
- }
74
- else
75
- {
76
- string propertyName = reader . GetString ( ) ;
77
- claims [ propertyName ] = JsonSerializerPrimitives . ReadPropertyValueAsObject ( ref reader , propertyName , JsonClaimSet . ClassName , true ) ;
78
- }
45
+ ReadHeaderValue ( ref reader , claims ) ;
79
46
}
80
47
// We read a JsonTokenType.StartObject above, exiting and positioning reader at next token.
81
48
else if ( JsonSerializerPrimitives . IsReaderAtTokenType ( ref reader , JsonTokenType . EndObject , false ) )
@@ -86,5 +53,65 @@ internal JsonClaimSet CreateHeaderClaimSet(ReadOnlySpan<byte> byteSpan)
86
53
87
54
return new JsonClaimSet ( claims ) ;
88
55
}
56
+
57
+
58
+ /// <summary>
59
+ /// Reads the value of a claim in the header and adds it to the <paramref name="claims"/> dictionary.
60
+ /// Can be overridden to read and add custom claims.
61
+ /// If a custom claim is read, the reader should be positioned at the next token after reading the claim.
62
+ /// </summary>
63
+ /// <param name="reader">The Utf8JsonReader instance positioned at a claim name token used to read the JSON payload.</param>
64
+ /// <param name="claims">Collection of claims that have been read from the reader.</param>
65
+ private protected virtual void ReadHeaderValue ( ref Utf8JsonReader reader , IDictionary < string , object > claims )
66
+ {
67
+ if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Alg ) )
68
+ {
69
+ claims [ JwtHeaderParameterNames . Alg ] = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Alg , ClassName , true ) ;
70
+ }
71
+ else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Cty ) )
72
+ {
73
+ claims [ JwtHeaderParameterNames . Cty ] = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Cty , ClassName , true ) ;
74
+ }
75
+ else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Kid ) )
76
+ {
77
+ claims [ JwtHeaderParameterNames . Kid ] = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Kid , ClassName , true ) ;
78
+ }
79
+ else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Typ ) )
80
+ {
81
+ claims [ JwtHeaderParameterNames . Typ ] = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Typ , ClassName , true ) ; ;
82
+ }
83
+ else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . X5t ) )
84
+ {
85
+ claims [ JwtHeaderParameterNames . X5t ] = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . X5t , ClassName , true ) ;
86
+ }
87
+ else if ( reader . ValueTextEquals ( JwtHeaderUtf8Bytes . Zip ) )
88
+ {
89
+ claims [ JwtHeaderParameterNames . Zip ] = JsonSerializerPrimitives . ReadString ( ref reader , JwtHeaderParameterNames . Zip , ClassName , true ) ;
90
+ }
91
+ else
92
+ {
93
+ string claimName = reader . GetString ( ) ;
94
+
95
+ if ( TryReadJwtClaim != null )
96
+ {
97
+ reader . Read ( ) ; // Move to the value
98
+ if ( TryReadJwtClaim ( ref reader , JwtSegmentType . Header , claimName , out object claimValue ) )
99
+ {
100
+ claims [ claimName ] = claimValue ;
101
+ reader . Read ( ) ; // Move to the next token
102
+ }
103
+ else
104
+ {
105
+ // The reader is positioned at the value token. The custom delegate did not read the value. Use our own logic.
106
+ claims [ claimName ] = JsonSerializerPrimitives . ReadPropertyValueAsObject ( ref reader , claimName , JsonClaimSet . ClassName , false ) ;
107
+ }
108
+ }
109
+ else
110
+ {
111
+ // Move the reader forward to the value and read it using our own logic.
112
+ claims [ claimName ] = JsonSerializerPrimitives . ReadPropertyValueAsObject ( ref reader , claimName , JsonClaimSet . ClassName , true ) ;
113
+ }
114
+ }
115
+ }
89
116
}
90
117
}
0 commit comments