Skip to content

Commit

Permalink
Fixes to claims.
Browse files Browse the repository at this point in the history
  • Loading branch information
pmaytak committed Jun 19, 2024
1 parent 464b592 commit 7b968be
Showing 1 changed file with 29 additions and 4 deletions.
33 changes: 29 additions & 4 deletions src/Microsoft.IdentityModel.JsonWebTokens/Json/JsonClaimSet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,24 +25,33 @@ internal class JsonClaimSet

internal object _claimsLock = new();
internal readonly Dictionary<string, object> _jsonClaims;

#if NET8_0_OR_GREATER
internal readonly Dictionary<string, (int startIndex, int length)?> _jsonClaimsBytes;
internal readonly Memory<byte> _tokenAsMemory;
#endif

private List<Claim> _claims;

internal JsonClaimSet()
{
_jsonClaims = new();
_jsonClaims = [];

#if NET8_0_OR_GREATER
_jsonClaimsBytes = new();
_jsonClaimsBytes = [];
_tokenAsMemory = Memory<byte>.Empty;
#endif
}

internal JsonClaimSet(Dictionary<string, object> jsonClaims)
{
_jsonClaims = jsonClaims;

#if NET8_0_OR_GREATER
_jsonClaimsBytes = [];
#endif
}

#if NET8_0_OR_GREATER
internal JsonClaimSet(
Dictionary<string, object> jsonClaims,
Expand All @@ -54,6 +63,7 @@ internal JsonClaimSet(
_tokenAsMemory = tokenAsMemory;
}
#endif

internal List<Claim> Claims(string issuer)
{
if (_claims == null)
Expand All @@ -69,6 +79,14 @@ internal List<Claim> CreateClaims(string issuer)
foreach (KeyValuePair<string, object> kvp in _jsonClaims)
CreateClaimFromObject(claims, kvp.Key, kvp.Value, issuer);

#if NET8_0_OR_GREATER
// _jsonClaimsBytes is only for string values for known claims, which would not be in _jsonClaims.
foreach (KeyValuePair<string, (int StartIndex, int Length)?> kvp in _jsonClaimsBytes)
{
string value = Encoding.UTF8.GetString(_tokenAsMemory.Slice(kvp.Value.Value.StartIndex, kvp.Value.Value.Length).Span);
claims.Add(new Claim(kvp.Key, value, ClaimValueTypes.String, issuer, issuer));
}
#endif
return claims;
}

Expand Down Expand Up @@ -168,7 +186,11 @@ internal Claim GetClaim(string key, string issuer)
if (key == null)
throw LogHelper.LogArgumentNullException(nameof(key));

#if NET8_0_OR_GREATER
if (_jsonClaims.TryGetValue(key, out object _) || _jsonClaimsBytes.TryGetValue(key, out _))
#else
if (_jsonClaims.TryGetValue(key, out object _))
#endif
{
foreach (var claim in Claims(issuer))
if (claim.Type == key)
Expand Down Expand Up @@ -197,7 +219,6 @@ internal string GetStringValue(string key)
return obj.ToString();
}
#endif

return string.Empty;
}

Expand Down Expand Up @@ -486,7 +507,11 @@ internal bool TryGetValue<T>(string key, out T value)

internal bool HasClaim(string claimName)
{
return _jsonClaims.TryGetValue(claimName, out _);
#if NET8_0_OR_GREATER
return _jsonClaims.ContainsKey(claimName) || _jsonClaimsBytes.ContainsKey(claimName);
#else
return _jsonClaims.ContainsKey(claimName);
#endif
}
}
}

0 comments on commit 7b968be

Please sign in to comment.