55using System . Collections . Generic ;
66using System . Text . Json ;
77using Microsoft . IdentityModel . Logging ;
8+ using Microsoft . IdentityModel . Tokens ;
89using Microsoft . IdentityModel . Tokens . Json ;
910
1011namespace Microsoft . IdentityModel . JsonWebTokens
@@ -41,41 +42,7 @@ internal JsonClaimSet CreateHeaderClaimSet(ReadOnlySpan<byte> byteSpan)
4142 {
4243 if ( reader . TokenType == JsonTokenType . PropertyName )
4344 {
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 ) ;
7946 }
8047 // We read a JsonTokenType.StartObject above, exiting and positioning reader at next token.
8148 else if ( JsonSerializerPrimitives . IsReaderAtTokenType ( ref reader , JsonTokenType . EndObject , false ) )
@@ -86,5 +53,65 @@ internal JsonClaimSet CreateHeaderClaimSet(ReadOnlySpan<byte> byteSpan)
8653
8754 return new JsonClaimSet ( claims ) ;
8855 }
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+ }
89116 }
90117}
0 commit comments