Skip to content

Commit 3613363

Browse files
committed
Replace overload with delegates to read token values.
1 parent 96b6b36 commit 3613363

File tree

5 files changed

+90
-43
lines changed

5 files changed

+90
-43
lines changed

src/Microsoft.IdentityModel.JsonWebTokens/Json/JsonClaimSet.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ internal class JsonClaimSet
2828

2929
internal JsonClaimSet()
3030
{
31-
_jsonClaims = new Dictionary<string, object>();
31+
_jsonClaims = [];
3232
}
3333

3434
internal JsonClaimSet(Dictionary<string, object> jsonClaims)

src/Microsoft.IdentityModel.JsonWebTokens/JsonWebToken.cs

+60
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,29 @@ public JsonWebToken(string jwtEncodedString)
8686
_encodedToken = jwtEncodedString;
8787
}
8888

89+
/// <summary>
90+
/// Initializes a new instance of <see cref="JsonWebToken"/> from a ReadOnlyMemory{char} in JWS or JWE Compact serialized format.
91+
/// </summary>
92+
/// <param name="encodedTokenMemory">A ReadOnlyMemory{char} containing the JSON Web Token serialized in JWS or JWE Compact format.</param>
93+
/// <param name="readTokenHeaderValueDelegate">A custom delegate to be called when each header claim is being read. If null, default implementation is called.</param>
94+
/// <param name="readTokenPayloadValueDelegate">A custom delegate to be called when each payload claim is being read. If null, default implementation is called.</param>
95+
public JsonWebToken(
96+
ReadOnlyMemory<char> encodedTokenMemory,
97+
ReadTokenHeaderValueDelegate readTokenHeaderValueDelegate,
98+
ReadTokenPayloadValueDelegate readTokenPayloadValueDelegate)
99+
{
100+
if (encodedTokenMemory.IsEmpty)
101+
throw LogHelper.LogExceptionMessage(new ArgumentNullException(nameof(encodedTokenMemory)));
102+
103+
ReadTokenHeaderValueDelegate = readTokenHeaderValueDelegate ?? ReadTokenHeaderValue;
104+
ReadTokenPayloadValueDelegate = readTokenPayloadValueDelegate ?? ReadTokenPayloadValue;
105+
106+
ReadToken(encodedTokenMemory);
107+
108+
_encodedTokenMemory = encodedTokenMemory;
109+
110+
}
111+
89112
/// <summary>
90113
/// Initializes a new instance of <see cref="JsonWebToken"/> from a ReadOnlyMemory{char} in JWS or JWE Compact serialized format.
91114
/// </summary>
@@ -141,6 +164,43 @@ public JsonWebToken(string header, string payload)
141164
_encodedToken = encodedToken;
142165
}
143166

167+
/// <summary>
168+
/// Called for each claim when token header is being read.
169+
/// </summary>
170+
/// <remarks>
171+
/// An example implementation:
172+
/// <code>
173+
/// object ReadPayloadValueDelegate(ref Utf8JsonReader reader, string claimName) =>
174+
/// {
175+
/// if (reader.ValueTextEquals("CustomProp"))
176+
/// {
177+
/// return JsonSerializerPrimitives.ReadString(ref reader, JwtRegisteredClaimNames.CustomProp, ClassName, true);
178+
/// }
179+
/// return JsonWebToken.ReadTokenHeaderValue(ref reader, claimName);
180+
/// }
181+
/// </code>
182+
/// </remarks>
183+
internal ReadTokenHeaderValueDelegate ReadTokenHeaderValueDelegate { get; set; } = ReadTokenHeaderValue;
184+
185+
186+
/// <summary>
187+
/// Called for each claim when token payload is being read.
188+
/// </summary>
189+
/// <remarks>
190+
/// An example implementation:
191+
/// <code>
192+
/// object ReadPayloadValueDelegate(ref Utf8JsonReader reader, string claimName) =>
193+
/// {
194+
/// if (reader.ValueTextEquals("CustomProp"))
195+
/// {
196+
/// return JsonSerializerPrimitives.ReadString(ref reader, JwtRegisteredClaimNames.CustomProp, ClassName, true);
197+
/// }
198+
/// return JsonWebToken.ReadTokenPayloadValue(ref reader, claimName);
199+
/// }
200+
/// </code>
201+
/// </remarks>
202+
internal ReadTokenPayloadValueDelegate ReadTokenPayloadValueDelegate { get; set; } = ReadTokenPayloadValue;
203+
144204
internal string ActualIssuer { get; set; }
145205

146206
internal ClaimsIdentity ActorClaimsIdentity { get; set; }

src/Microsoft.IdentityModel.Tokens/Delegates.cs

+19
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Text.Json;
67
using System.Threading.Tasks;
78

89
namespace Microsoft.IdentityModel.Tokens
@@ -206,4 +207,22 @@ namespace Microsoft.IdentityModel.Tokens
206207
/// <returns>The validated <see cref="SecurityToken"/>.</returns>
207208
internal delegate ValidationResult<SecurityKey> SignatureValidationDelegate(SecurityToken token, ValidationParameters validationParameters, BaseConfiguration? configuration, CallContext? callContext);
208209
#nullable restore
210+
211+
/// <summary>
212+
/// Definition for ReadTokenHeaderValueDelegate.
213+
/// Called for each claim when token header is being read.
214+
/// </summary>
215+
/// <param name="reader">Reader for the underlying token bytes.</param>
216+
/// <param name="claimName">The name of the claim being read.</param>
217+
/// <returns></returns>
218+
public delegate object ReadTokenHeaderValueDelegate(ref Utf8JsonReader reader, string claimName);
219+
220+
/// <summary>
221+
/// Definition for ReadTokenPayloadValueDelegate.
222+
/// Called for each claim when token payload is being read.
223+
/// </summary>
224+
/// <param name="reader">Reader for the underlying token bytes.</param>
225+
/// <param name="claimName">The name of the claim being read.</param>
226+
/// <returns></returns>
227+
public delegate object ReadTokenPayloadValueDelegate(ref Utf8JsonReader reader, string claimName);
209228
}

src/Microsoft.IdentityModel.Tokens/TokenValidationParameters.cs

+10
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,16 @@ public string NameClaimType
449449
/// </summary>
450450
public IDictionary<string, object> PropertyBag { get; set; }
451451

452+
/// <summary>
453+
/// Gets or sets a delegate that will be called when reading token payload claims.
454+
/// </summary>
455+
public ReadTokenHeaderValueDelegate ReadTokenHeaderValue { get; set; }
456+
457+
/// <summary>
458+
/// Gets or sets a delegate that will be called when reading token payload claims.
459+
/// </summary>
460+
public ReadTokenPayloadValueDelegate ReadTokenPayloadValue { get; set; }
461+
452462
/// <summary>
453463
/// Gets or sets a boolean to control if configuration required to be refreshed before token validation.
454464
/// </summary>

test/Microsoft.IdentityModel.JsonWebTokens.Tests/CustomJsonWebToken.cs

-42
This file was deleted.

0 commit comments

Comments
 (0)